[AGFC: Valley of Gothic] М: Уроки скриптологии

Страница 4 из 8 1234 5678
Поиск в этой теме:

Расширенный поиск
Старый 05.03.2005, 09:58   #121
Vam

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

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

// ************************************************** ***********************
// Обработчик состояния комментирования подставной гильдии (переодетого ГГ)
// -------------------------------------------------------------------------
// self - НПС источник информации, other - НПС приемник информации (обычно ГГ)
// ************************************************** ***********************

func void ZS_CommentFakeGuild()
{
* *// разрешить минимальный набор восприятий
* *Perception_Set_Minimal();
* *// НПС встает
* *AI_StandUp(self);
* *// если НПС не сидит
* *if(!C_BodystateContains(self,BS_SIT))
* *{ *
* * * *// НПС поворачивается к ГГ
* * * *B_TurnToNpc(self,other);
* *};
* *// если ГГ не сидит
* *if(!C_BodystateContains(other,BS_SIT))
* *{ *
* * * *// ГГ поворачивается к НПС
* * * *B_TurnToNpc(other,self);
* * * *// если расстояние между ГГ и НПС < 80 см
* * * *if(Npc_GetDistToNpc(other,self) < 80)
* * * *{
* * * * * *// ГГ делает шаг назад
* * * * * *AI_Dodge(other);
* * * *};
* *};
* *// если на ГГ одеты доспехи
* *if(Npc_HasEquippedArmor(other) == TRUE)
* *{
* * * *var C_Item itm;
* * * *// получить ссылку на доспехи
* * * *itm = Npc_GetEquippedArmor(other); *
* * * *// если НПС милиционер или паладин
* * * *if(self.guild == GIL_MIL ¦¦ self.guild == GIL_PAL)
* * * *{
* * * * * *// НПС говорит ГГ (SVM фраза "Ты солдат! Одевайся соответственно.")
* * * * * *B_Say (self,other, "$ADDON_WRONGARMOR_MIL");
* * * *}
* * * *// иначе, если НПС маг послушник или маг огня
* * * *else if(self.guild == GIL_NOV ¦¦ self.guild == GIL_KDF)
* * * *{
* * * * * *// НПС говорит ГГ (SVM фраза "Эта одежда не соответствует нашему ордену. Переоденься.")
* * * * * *B_Say(self,other,"$ADDON_WRONGARMOR_KDF");
* * * *}
* * * *// иначе, если НПС наемник или охотник на драконов
* * * *else if(self.guild == GIL_SLD ¦¦ self.guild == GIL_DJG)
* * * *{
* * * * * *// НПС говорит ГГ (SVM фраза "В каком виде ты тут бродишь? Одень что-то приличное.")
* * * * * *B_Say(self,other,"$ADDON_WRONGARMOR_SLD");
* * * *}
* * * *else // иначе (другие гильдии)
* * * *{
* * * * * *// НПС говорит ГГ (SVM фраза "Это не твоя одежда. Я с тобой не буду говорить.")
* * * * * *B_Say(self,other,"$ADDON_WRONGARMOR");
* * * *}; *
* *}
* *else // иначе (ГГ без доспехов)
* *{
* * * *// если НПС бандит
* * * *if(self.guild == GIL_BDT)
* * * *{
* * * * * *// НПС говорит ГГ (SVM фраза "Да на тебе даже кольчуги нет. Проваливай!")
* * * * * *B_Say(self,other,"$ADDON_NOARMOR_BDT");
* * * *};
* *};
};

... иеще файл

// **************************************
// Функция подготовки НПС боеприпасов
// **************************************

// ======================================
// Аргументы:
// --------------------------------------
// slf - экипируемый НПС
// ======================================

func void B_CreateAmmo(var C_NPC slf)
{
* *var C_ITEM rangedWeapon;
* *// если НПС находится в боевом режиме с оружием дальнего радиуса поражения
* *if(Npc_IsInFightMode(slf,FMODE_FAR))
* *{
* * * *// получить оружие, которое НПС держит в руках
* * * *rangedWeapon = Npc_GetReadiedWeapon(slf);
* *}
* *// иначе, если НПС экипирован оружием дальнего радиуса поражения
* *else if(Npc_HasEquippedRangedWeapon(slf))
* *{
* * * *// получить оружие дальнего радиуса поражения, которым экипирован НПС
* * * *rangedWeapon = Npc_GetEquippedRangedWeapon(slf);
* *}
* *else // иначе
* *{
* * * *return;
* *};
* *// если боезапас - Стрела
* *if(rangedWeapon.munition == ItRw_Arrow)
* *{
* * * *// если у НПС < 10 стрел
* * * *if(Npc_HasItems(slf,ItRw_Arrow) < 10)
* * * *{
* * * * * *// создать в инвентаре НПС 10 стрел
* * * * * *CreateInvItems(slf,ItRw_Arrow,10);
* * * *};
* *}
* *// иначе, если боезапас - Болт
* *else if(rangedWeapon.munition == ItRw_Bolt)
* *{
* * * *// если у НПС < 10 болтов
* * * *if(Npc_HasItems(slf,ItRw_Bolt) < 10)
* * * *{
* * * * * *// создать в инвентаре НПС 10 болтов
* * * * * *CreateInvItems(slf,ItRw_Bolt,10);
* * * *};
* *}; *
};

... и еще

// **************************************
// Функция добивания НПС
// **************************************

// ======================================
// Аргументы:
// --------------------------------------
// slf *- НПС агрессор
// oth *- НПС жертва
// ======================================

func void B_FinishingMove(var C_NPC slf,var C_Npc oth)
{
* *// если агрессор не находится в режиме сражения с оружием ближнего радиуса поражения
* *if(!Npc_IsInFightMode(slf,FMODE_MELEE))
* *{
* * * *// агрессор ставится в режим сражения с оружием Ржавый меч
* * * *Npc_SetToFightMode(slf,ItMw_1h_MISC_Sword);
* *};
* *// агрессор добивает жертву
* *AI_FinishingMove (slf, oth);
};

... и еще

// ********************************
// НПС перестает смотреть на цель
// ********************************

// ================================
// Аргументы:
// --------------------------------
// slf *- смотрящий НПС
// ================================

func void B_StopLookAt(var C_NPC slf)
{
* *var C_NPC target;
* *// получить цель, на которую смотрит НПС
* *target = Npc_GetLookAtTarget(slf);
* *// если цель существует
* *if(Hlp_IsValidNpc(target))
* *{
* * * *// НПС перестает смотреть на цель
* * * *AI_StopLookAt (slf);
* *};
};

// ***************************
// НПС смотрит на другого НПС
// ***************************

// ===========================
// Аргументы:
// ---------------------------
// slf *- смотрящий НПС
// oth *- НПС цель
// ===========================

func void B_LookAtNpc(var C_NPC slf,var C_NPC oth)
{
* *// НПС перестает смотреть на старую цель
* *B_StopLookAt(slf);
* *// НПС смотрит на новую цель
* *AI_LookAtNpc(slf,oth);
};

// **************************************
// НПС поворачивается к другому НПС
// **************************************

// ======================================
// Аргументы:
// --------------------------------------
// slf *- поворачивающийся НПС
// oth *- НПС цель
// ======================================

func void B_TurnToNpc(var C_NPC slf,var C_Npc oth)
{
* *// НПС поворачивается к цели
* *AI_TurnToNpc(slf,oth);
};

... и еще

// *********************************
// Перевод НПС в исходное состояние
// *********************************

// ================================
// Аргументы:
// --------------------------------
// slf *- НПС, переводимый в исходное состояние
// ================================

func void B_ResetAll(var C_NPC slf)
{
* *// НПС перестает смотреть на цель
* *B_StopLookAt(slf);
* *// НПС прячет оружие
* *AI_RemoveWeapon(slf);
};

... и еще

// *******************************
// НПС говорит SVM фразу
// *******************************

// ===============================
// Аргументы:
// -------------------------------
// slf *- говорящий НПС
// oth *- слушающий НПС
// text - имя переменной класса C_SVM, которая содержит произносимую фразу (должно начинаться с символа $)
// ===============================

func void B_Say(var C_NPC slf,var C_Npc oth,var string text)
{
* *// НПС говорит другому НПС SVM (Standart Voice Module) фразу
* *AI_OutputSVM(slf,oth,text);
};


Функция B_RemoveWeapon нигде не вызывается и файл B_RemoveWeapon.d может быть удален.
Ответить с цитированием
Старый 06.03.2005, 13:35   #122
Vam

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

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

// ******************************
// Комментарий завершенной атаки
// ------------------------------
// self - агрессор, other - жертва
// ******************************

func void B_Say_AttackEnd()
{
* *// если агрессор атаковал врага или монстра, убившего человека
* *if(self.aivar[AIV_ATTACKREASON] == AR_GuildEnemy) ¦¦ (self.aivar[AIV_ATTACKREASON] == AR_MonsterMurderedHuman)
* *{
* * * *// если жертва человек
* * * *if(other.guild < GIL_SEPERATOR_HUM)
* * * *{
* * * * * *// если жертва не убита
* * * * * *if(!Npc_IsDead(other))
* * * * * *{
* * * * * * * *// если последняя атакованная цель и есть жертва
* * * * * * * *if(self.aivar[AIV_LASTTARGET] == Hlp_GetInstanceID(other))
* * * * * * * *{
* * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Умри, подлец!"
* * * * * * * * * *B_Say(self,other,"$KILLENEMY");
* * * * * * * *}
* * * * * * * *else // иначе
* * * * * * * *{
* * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Да, убей эту свинью!"
* * * * * * * * * *B_Say(self,other,"$GOODKILL");
* * * * * * * *};
* * * * * *}
* * * * * *else // иначе (жертва мертва)
* * * * * *{
* * * * * * * *// агрессор говорит жертве (SVM фраза) "Ты это заслужил, подлец!"
* * * * * * * *B_Say(self,other,"$ENEMYKILLED");
* * * * * *};
* * * *}
* * * *else // иначе (жертва монстр)
* * * *{
* * * * * *// если агрессор член партии ГГ
* * * * * *if(self.aivar[AIV_PARTYMEMBER] == TRUE)
* * * * * *{
* * * * * * * *var int rnd;
* * * * * * * *rnd = Hlp_Random(100);
* * * * * * * *// если вероятность 0.85 и жертва не дракон
* * * * * * * *if(rnd > 15) && (other.guild != GIL_DRAGON)
* * * * * * * *{
* * * * * * * * * *return;
* * * * * * * *};
* * * * * *};
* * * * * *// если жертва убита не ГГ
* * * * * *if(other.aivar[AIV_KilledByPlayer] == FALSE)
* * * * * *{
* * * * * * * *// если агрессор имеет номер голоса 9
* * * * * * * *if(self.voice == 9)
* * * * * * * *{
* * * * * * * * * *var int random;
* * * * * * * * * *random = Hlp_Random(2);
* * * * * * * * * *// если вероятность 0.5
* * * * * * * * * *if(random == 0)
* * * * * * * * * *{
* * * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "С тобой покончено, скотина!"
* * * * * * * * * * * *B_Say(self,other,"$ADDON_MONSTERKILLED");
* * * * * * * * * *}
* * * * * * * * * *else
* * * * * * * * * *{
* * * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "На ОДНУ тварь меньше."
* * * * * * * * * * * *B_Say(self,other,"$ADDON_MONSTERKILLED2");
* * * * * * * * * *};
* * * * * * * *}
* * * * * * * *// тначе, если агрессор имеет номер голоса 12
* * * * * * * *else if(self.voice == 12)
* * * * * * * *{
* * * * * * * * * *// если агрессор Горн
* * * * * * * * * *if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(GornOW)) * * * * * // в Рудниковой долине
* * * * * * * * * *¦¦ (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(GornDJG)) * * * * *// охотник на драконов
* * * * * * * * * *¦¦ (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(GornNW_vor_DJG)) * // охотник на драконов в лагере наемников
* * * * * * * * * *¦¦ (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(GornNW_nach_DJG)) *// охотник на драконов в 6 главе
* * * * * * * * * *¦¦ (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Gorn_DI))) * * * * // на острове драконов
* * * * * * * * * *{
* * * * * * * * * * * *var int randy;
* * * * * * * * * * * *randy = Hlp_Random(2);
* * * * * * * * * * * *// если вероятность 0.5
* * * * * * * * * * * *if(randy == 0)
* * * * * * * * * * * *{
* * * * * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "С тобой покончено, скотина!"
* * * * * * * * * * * * * *B_Say(self,other,"$ADDON_MONSTERKILLED");
* * * * * * * * * * * *}
* * * * * * * * * * * *else
* * * * * * * * * * * *{
* * * * * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Одной тварью меньше!"
* * * * * * * * * * * * * *B_Say (self,other,"$MONSTERKILLED");
* * * * * * * * * * * *};
* * * * * * * * * *}
* * * * * * * * * *else
* * * * * * * * * *{
* * * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "С тобой покончено, скотина!"
* * * * * * * * * * * *B_Say(self,other,"$ADDON_MONSTERKILLED");
* * * * * * * * * *};
* * * * * * * *}
* * * * * * * *else // другие голоса
* * * * * * * *{
* * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Одной тварью меньше!"
* * * * * * * * * *B_Say(self,other,"$MONSTERKILLED");
* * * * * * * *};
* * * * * *}
* * * * * *else // иначе (жертва убита ГГ)
* * * * * *{
* * * * * * * *// ГГ говорит жертве (SVM фраза) "Хорошая работа - одной тварью меньше!"
* * * * * * * *B_Say(self,other,"$GOODMONSTERKILL"); * * *
* * * * * *};
* * * *};
* * * *return;
* *};
* *// если агрессор атаковал вора
* *if(self.aivar[AIV_ATTACKREASON] == AR_Theft)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "И не пытайся больше обокрасть меня!"
* * * *B_Say(self,other,"$THIEFDOWN");
* * * *return;
* *};
* *// агрессор атаковал ГГ, вскрывшего его сундук
* *if(self.aivar[AIV_ATTACKREASON] == AR_UseMob)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "В следующий раз не советую тебе шарить по чужим вещам!"
* * * *B_Say(self,other,"$RUMFUMMLERDOWN");
* * * *return;
* *};
* *// если агрессор атаковал убийцу овец
* *if (self.aivar[AIV_ATTACKREASON] == AR_SheepKiller)
* *{
* * * *// если жертва человек
* * * *if(other.guild < GIL_SEPERATOR_HUM)
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "Никогда больше не делай этого! Это же наши овцы!"
* * * * * *B_Say(self,other,"$SHEEPATTACKERDOWN");
* * * *}
* * * *else // иначе (жертва монстр)
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "Одной тварью меньше!"
* * * * * *B_Say(self,other,"$MONSTERKILLED");
* * * *};
* * * *return;
* *};
* *// если агрессор атаковал человека, убившего другого человека
* *if(self.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman)
* *{
* * * *// если жертва не убита
* * * *if(!Npc_IsDead(other))
* * * *{
* * * * * *// если последняя атакованная цель и есть жертва
* * * * * *if(self.aivar[AIV_LASTTARGET] == Hlp_GetInstanceID(other))
* * * * * *{
* * * * * * * *// агрессор говорит жертве (SVM фраза) "Умри, убийца!"
* * * * * * * *B_Say(self,other,"$KILLMURDERER");
* * * * * *}
* * * * * *else // иначе
* * * * * *{
* * * * * * * *// агрессор говорит жертве (SVM фраза) "Да, убей эту свинью!"
* * * * * * * *B_Say(self,other,"$GOODKILL");
* * * * * *};
* * * *}
* * * *else // иначе (жертва убита)
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "Ты это заслужил, подлец!"
* * * * * *B_Say(self,other,"$ENEMYKILLED");
* * * *};
* * * *return;
* *};
* *// если агрессор помогает убить монстра
* *if(self.aivar[AIV_ATTACKREASON] == AR_MonsterVsHuman)
* *{
* * * *// если голос агрессора 9 или 12
* * * *if(self.voice == 9) ¦¦ (self.voice == 12)
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "С тобой покончено, скотина!"
* * * * * *B_Say(self,other,"$ADDON_MONSTERKILLED");
* * * *}
* * * *else // иначе (другие голоса)
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "Одной тварью меньше!"
* * * * * *B_Say(self,other,"$MONSTERKILLED");
* * * *};
* * * *return;
* *};
* *// если охрана ворот атакует монстра
* *if(self.aivar[AIV_ATTACKREASON] == AR_MonsterCloseToGate)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Тупоголовая скотина!"
* * * *B_Say(self,other,"$STUPIDBEASTKILLED");
* * * *return;
* *};
* *// если агрессор реагировал на повреждение (на него напали первым)
* *if(self.aivar[AIV_ATTACKREASON] == AR_ReactToDamage)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Больше никогда не спорь со мной!"
* * * *B_Say(self,other,"$NEVERHITMEAGAIN");
* * * *return;
* *};
* *// если агрессор реагировал на обнаженное оружие
* *if(self.aivar[AIV_ATTACKREASON] == AR_ReactToWeapon)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Это будет тебе уроком!"
* * * *B_Say(self,other,"$YOUBETTERSHOULDHAVELISTENED");
* * * *return;
* *};
* *// если агрессор реагировал на вход в его помещение или вызвана охраны для защиты помещения
* *if(self.aivar[AIV_ATTACKREASON] == AR_ClearRoom) ¦¦ (self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToRoom)
* *{
* * * *// если ГГ находится в помещении, принадлежащем агрессору
* * * *if(C_NpcIsBotheredByPlayerRoomGuild(self))
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "А теперь убирайся отсюда!"
* * * * * *B_Say(self,other,"$GETUPANDBEGONE");
* * * *}
* * * *else // иначе (вне помещения)
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "И чтоб я больше тебя здесь не видел!"
* * * * * *B_Say(self,other,"$NEVERENTERROOMAGAIN");
* * * *};
* * * *return;
* *};
* *// если причина атаки - ГГ в помещении с ограниченным доступом
* *if(self.aivar[AIV_ATTACKREASON] == AR_LeftPortalRoom)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "И чтоб я больше тебя здесь не видел!"
* * * *B_Say(self,other,"$NEVERENTERROOMAGAIN");
* * * *return;
* *};
* *// если охрана ворот атакует незваного гостя
* *if(self.aivar[AIV_ATTACKREASON] == AR_GuardStopsIntruder)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Умри, подлец!"
* * * *B_Say(self,other,"$KILLENEMY");
* * * *return;
* *};
* *// если охрана прекратила атаковать преступника
* *if(self.aivar[AIV_ATTACKREASON] == AR_GuardStopsFight)
* *{
* * * *// если жертва наемник или охотник на драконов
* * * *if(other.guild == GIL_SLD) ¦¦ (other.guild == GIL_DJG)
* * * *{
* * * * * *// молчат
* * * *}
* * * *else // иначе
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "Борьбы здесь не будет, ясно!? Заруби это себе на носу!"
* * * * * *B_Say(self,other,"$THEREISNOFIGHTINGHERE");
* * * *};
* * * *return;
* *};
* *// если вызвана охрана по факту воровства
* *if(self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToThief)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "В следующий раз не советую тебе шарить по чужим вещам!"
* * * *B_Say(self,other,"$RUMFUMMLERDOWN");
* * * *return;
* *};
* *return;
};

Ответить с цитированием
Старый 07.03.2005, 22:00   #123
Vam

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

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

// ********************************
// Комментарий причины атаки
// --------------------------------
// self - агрессор, other - жертва
// ********************************

func void B_Say_AttackReason()
{
* *// если гильдии агрессора и жертвы не враждебны и жертва враждебна агрессору
* *if(Wld_GetGuildAttitude(self.guild,other.guild) != ATT_HOSTILE) && (Npc_GetAttitude(self,other) == ATT_HOSTILE)
* *{
* * * *// если причина атаки - убийство ГГ НПС
* * * *if(self.aivar[AIV_ATTACKREASON] == AR_KILL)
* * * *{
* * * * * *return;
* * * *};
* * * *// агрессор говорит жертве (SVM фраза) "Я тебя сейчас убью!"
* * * *B_Say_Overlay(self,other,"$IGETYOUSTILL");
* * * *return;
* *};
* *// если жертва враг гильдии агрессора
* *if(self.aivar[AIV_ATTACKREASON] == AR_GuildEnemy)
* *{
* * * *// если агрессор член партии ГГ
* * * *if(self.aivar[AIV_PARTYMEMBER] == TRUE)
* * * *{
* * * * * *var int rnd;
* * * * * *rnd = Hlp_Random(100);
* * * * * *// если вероятность 0.85
* * * * * *if(rnd > 15)
* * * * * *{
* * * * * * * *return;
* * * * * *};
* * * *};
* * * *// если жертва человек
* * * *if(other.guild < GIL_SEPERATOR_HUM)
* * * *{
* * * * * *// если ГГ переодетый бандит
* * * * * *if(C_PlayerIsFakeBandit(self,other) == TRUE)
* * * * * *{
* * * * * * * *// агрессор говорит жертве (SVM фраза) "Умри, грязный бандюга!"
* * * * * * * *B_Say_Overlay(self,other,"$ADDON_DIEBANDIT"); * * * * *
* * * * * * * *// агрессор посылает восприятие нападения
* * * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);
* * * * * *}
* * * * * *// иначе, если ГГ переодетый пират
* * * * * *else if(C_PlayerIsFakePirate(self,other) == TRUE)
* * * * * *{
* * * * * * * *// агрессор говорит жертве (SVM фраза) "Я тебя прикончу, Пират!"
* * * * * * * *B_Say_Overlay (self,other, "$ADDON_DIRTYPIRATE");
* * * * * * * *// агрессор посылает восприятие нападения
* * * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);
* * * * * *}
* * * * * *else // иначе
* * * * * *{
* * * * * * * *// агрессор говорит жертве (SVM фраза) "Теперь твоя очередь!"
* * * * * * * *B_Say_Overlay(self,other,"$DIEENEMY");
* * * * * * * *// агрессор посылает восприятие нападения
* * * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);
* * * * * *};
* * * *}
* * * *else // иначе (жертва монстр)
* * * *{
* * * * * *// если голос агрессора 9
* * * * * *if(self.voice == 9)
* * * * * *{ *
* * * * * * * *var int random;
* * * * * * * *random = Hlp_Random(3);
* * * * * * * *if(random < 1)
* * * * * * * *{
* * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Тут снова крутится одна из этих тварей!"
* * * * * * * * * *B_Say_Overlay(self,other,"$DIEMONSTER"); * *
* * * * * * * *}
* * * * * * * *else if(random == 1)
* * * * * * * *{
* * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Снова одна из этих тварей!"
* * * * * * * * * *B_Say_Overlay(self,other,"$ADDON_DIEMONSTER"); *
* * * * * * * *}
* * * * * * * *else
* * * * * * * *{
* * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Вот опять одна из тварюг!"
* * * * * * * * * *B_Say_Overlay(self,other,"$ADDON_DIEMONSTER2");
* * * * * * * *};
* * * * * *}
* * * * * *else // иначе (другие голоса)
* * * * * *{
* * * * * * * *// агрессор говорит жертве (SVM фраза) "Тут снова крутится одна из этих тварей!"
* * * * * * * *B_Say_Overlay(self,other,"$DIEMONSTER");
* * * * * *};
* * * * * *// агрессор посылает восприятие нападения
* * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);
* * * *};
* * * *return;
* *};
* *// если агрессор атакует вора
* *if(self.aivar[AIV_ATTACKREASON] == AR_Theft)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Погоди у меня, гадкий воришка!"
* * * *B_Say_Overlay(self,other,"$DIRTYTHIEF");
* * * *return;
* *};
* *// если агрессор атакует грабителя сундуков
* *if(self.aivar[AIV_ATTACKREASON] == AR_UseMob)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Руки прочь!"
* * * *B_Say_Overlay(self,other,"$HANDSOFF");
* * * *return;
* *};
* *// если агрессор атакует убийцу овец
* *if(self.aivar[AIV_ATTACKREASON] == AR_SheepKiller)
* *{
* * * *// если жертва человек
* * * *if(other.guild < GIL_SEPERATOR_HUM)
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "Этот подлец убивает наших овец!"
* * * * * *B_Say_Overlay(self,other,"$SHEEPKILLER");
* * * *}
* * * *else // иначе (жертва монстр)
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "Эта проклятая тварь сжирает наших овец!"
* * * * * *B_Say_Overlay(self,other,"$SHEEPKILLERMONSTER");
* * * *};
* * * *return;
* *};
* *
* *// если агрессор атакует человека, убившего человека
* *if(self.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Убийца!"
* * * *B_Say_Overlay(self,other,"$YOUMURDERER");
* * * *// агрессор посылает восприятие нападения
* * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);
* * * *return;
* *};
* *// если агрессор атакует монстра, убившего человека
* *if(self.aivar[AIV_ATTACKREASON] == AR_MonsterMurderedHuman)
* *{
* * * *// нет комментариев
* * * *return;
* *};
* *// если агрессор помогает убить монстра
* *if(self.aivar[AIV_ATTACKREASON] == AR_MonsterVsHuman)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Тут снова крутится одна из этих тварей!"
* * * *B_Say_Overlay(self,other,"$DIEMONSTER");
* * * *// агрессор посылает восприятие нападения
* * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);
* * * *return;
* *};
* *// если охрана ворот атакует монстра
* *if (self.aivar[AIV_ATTACKREASON] == AR_MonsterCloseToGate)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Тут не пройдет ни одна тварь!"
* * * *B_Say_Overlay(self,other,"$DIESTUPIDBEAST");
* * * *return;
* *};
* *// если на агрессора напали
* *if(self.aivar[AIV_ATTACKREASON] == AR_ReactToDamage)
* *{
* * * *// напавший монстр
* * * *if(other.guild > GIL_SEPERATOR_HUM)
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "Ты получил, что хотел!"
* * * * * *B_Say_Overlay(self,other,"$YOUASKEDFORIT");
* * * * * *return;
* * * *}
* * * *else // иначе (человек)
* * * *{
* * * * * *// агрессор говорит жертве (SVM фраза) "Ты у меня дождешься, подлец!"
* * * * * *B_Say_Overlay(self,other,"$YOUDAREHITME");
* * * * * *return;
* * * *};
* *};
* *// если агрессор среагировал нп обнаженное оружие
* *if(self.aivar[AIV_ATTACKREASON] == AR_ReactToWeapon)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Ты получил, что хотел!"
* * * *B_Say_Overlay(self,other,"$YOUASKEDFORIT");
* * * *return;
* *};
* *// если агрессор реагировал на вход в его помещение
* *if(self.aivar[AIV_ATTACKREASON] == AR_ClearRoom)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Тогда я должен тебя поколотить!"
* * * *B_Say_Overlay(self,other,"$THENIBEATYOUOUTOFHERE" );
* * * *return;
* *};
* *// если причина атаки - ГГ в помещении с ограниченным доступом
* *if(self.aivar[AIV_ATTACKREASON] == AR_LeftPortalRoom)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Чего это ты там ищешь, ей!"
* * * *B_Say_Overlay(self,other,"$WHATDIDYOUDOINTHERE");
* * * *return;
* *};
* *// если охрана прекратила атаковать преступника
* *if(self.aivar[AIV_ATTACKREASON] == AR_GuardStopsFight)
* *{
* * * *// агрессор говорит жертве (SVM фраза) "Вы хотите с этим покончить по-хорошему?!"
* * * *B_Say_Overlay(self,other,"$WILLYOUSTOPFIGHTING");
* * * *return;
* *};
* *// если вызвана охрана по факту воровства
* *if(self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToThief)
* *{
* * * *return;
* *};
* *// если вызвана охраны для защиты помещения
* *if(self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToRoom)
* *{
* * * *return;
* *};
* *return;
};


Функция B_Say_FleeReason нигде не вызывается и файл B_Say_FleeReason.d может быть удален.
Ответить с цитированием
Старый 08.03.2005, 15:39   #124
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

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

2Vam:
[q]Когда выйдет вторая часть, и кто её оформит, пока сказать не могу.[/q]
Вот-с, поработал тут слегка, добавил новое и оптимизировал старое + обновил дизайн :)
Ссылка та же: http://gothic3.allgothic.ru/filezzz/Vam_tutor.rar (60Кб)
Для тех, кто не понял, это все "Уроки скриптологии", собранные в одном HTML-файле :D :D :D

З.Ы. 2Vam:
Тебя там всё устраивает? ::)
Отправить личное сообщение для Ответить с цитированием
Старый 13.03.2005, 23:11   #125
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

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

2Vam:
Почему уроки прекратились? Что-то случилось? ::)

2basilio58:
Спасибо за труд!!
Да не за что, для себя ведь тоже делал :)

2All:
Кстати, я тут довёл до конца подсветку синтаксиса, ну и еще кой-чего доработал, в общем ещё раз обновил файл.
Ссылка как всегда та же :D :D :D
Отправить личное сообщение для Ответить с цитированием
Старый 24.03.2005, 10:55   #126
Vam

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

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

// ************************************************** ************
// НПС slf называет НПС oth сумму денежного выражения goldAmount
// ************************************************** ************

func void B_Say_Gold(var C_NPC slf,var C_NPC oth,var int goldAmount)
{
* *if(goldAmount == 1000) *{ B_Say(slf,oth,"$GOLD_1000"); *};
* *if(goldAmount == 950) * { B_Say(slf,oth,"$GOLD_950"); * };
* *if(goldAmount == 900) * { B_Say(slf,oth,"$GOLD_900"); * };
* *if(goldAmount == 850) * { B_Say(slf,oth,"$GOLD_850"); * };
* *if(goldAmount == 800) * { B_Say(slf,oth,"$GOLD_800"); * };
* *if(goldAmount == 750) * { B_Say(slf,oth,"$GOLD_750"); * };
* *if(goldAmount == 700) * { B_Say(slf,oth,"$GOLD_700"); * };
* *if(goldAmount == 650) * { B_Say(slf,oth,"$GOLD_650"); * };
* *if(goldAmount == 600) * { B_Say(slf,oth,"$GOLD_600"); * };
* *if(goldAmount == 550) * { B_Say(slf,oth,"$GOLD_550"); * };
* *if(goldAmount == 500) * { B_Say(slf,oth,"$GOLD_500"); * };
* *if(goldAmount == 450) * { B_Say(slf,oth,"$GOLD_450"); * };
* *if(goldAmount == 400) * { B_Say(slf,oth,"$GOLD_400"); * };
* *if(goldAmount == 350) * { B_Say(slf,oth,"$GOLD_350"); * };
* *if(goldAmount == 300) * { B_Say(slf,oth,"$GOLD_300"); * };
* *if(goldAmount == 250) * { B_Say(slf,oth,"$GOLD_250"); * };
* *if(goldAmount == 200) * { B_Say(slf,oth,"$GOLD_200"); * };
* *if(goldAmount == 150) * { B_Say(slf,oth,"$GOLD_150"); * };
* *if(goldAmount == 100) * { B_Say(slf,oth,"$GOLD_100"); * };
* *if(goldAmount == 90) * *{ B_Say(slf,oth,"$GOLD_90"); * *};
* *if(goldAmount == 80) * *{ B_Say(slf,oth,"$GOLD_80"); * *};
* *if(goldAmount == 70) * *{ B_Say(slf,oth,"$GOLD_70"); * *};
* *if(goldAmount == 60) * *{ B_Say(slf,oth,"$GOLD_60"); * *};
* *if(goldAmount == 50) * *{ B_Say(slf,oth,"$GOLD_50"); * *};
* *if(goldAmount == 40) * *{ B_Say(slf,oth,"$GOLD_40"); * *};
* *if(goldAmount == 30) * *{ B_Say(slf,oth,"$GOLD_30"); * *};
* *if(goldAmount == 20) * *{ B_Say(slf,oth,"$GOLD_20"); * *};
* *if(goldAmount == 10) * *{ B_Say(slf,oth,"$GOLD_10"); * *};
};

... еще файл

// *******************************
// НПС slf преветствует НПС oth
// *******************************

func void B_Say_GuildGreetings(var C_NPC slf,var C_NPC oth)
{
* *// если милиция приветствует милицию или паладина
* *if(slf.guild == GIL_MIL) && ((oth.guild == GIL_MIL) ¦¦ (oth.guild == GIL_PAL))
* *{
* * * *// звучит SVM фраза "За короля!"
* * * *B_Say_Overlay(slf,oth,"$MILGREETINGS");
* * * *return;
* *};
* *// если паладин приветствует паладина или милицию или магов огня
* *if(slf.guild == GIL_PAL) && ((oth.guild == GIL_PAL) ¦¦ (oth.guild == GIL_MIL) ¦¦ (oth.guild == GIL_KDF))
* *{
* * * *// звучит SVM фраза "За Инноса!"
* * * *B_Say_Overlay (slf,oth,"$PALGREETINGS");
* * * *return;
* *};
* *// если маг огня приветствует паладина или мага послушника или мага огня
* *if(slf.guild == GIL_KDF) && ((oth.guild == GIL_PAL) ¦¦ (oth.guild == GIL_NOV) ¦¦ (oth.guild == GIL_KDF))
* *{
* * * *// звучит SVM фраза "За Инноса!"
* * * *B_Say_Overlay (slf,oth,"$PALGREETINGS");
* * * *return;
* *};
* *// если приветствующий Барток и он сообщал об одиноком орке перед Хоринисом
* *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Bartok)) && (Bartok_OrkGesagt == TRUE)
* *{
* * * *// Барток говорит об одиноком орке перед Хоринисом
* * * *B_Bartok_ShitAnOrc();
* * * *return;
* *};
* *// если приветствующий Кок
* *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Koch))
* *{
* * * *// Кок говорит о топоре
* * * *B_Koch_Hackebeil();
* * * *return;
* *};
* *var int zufall;
* *zufall = Hlp_Random(100);
* *// с вероятностью 0.1 и если идет дождь
* *if((zufall <= 10) && Wld_IsRaining())
* *{
* * * *// звучит SVM фраза "Ну и скверная же погода!"
* * * *B_Say_Overlay(slf,oth,"$WEATHER");
* * * *return;
* * * *
* *};
};

... и ещё

// ************************************************
// *Мини реплики НПС
// ************************************************

func void B_Say_Smalltalk()
{
* *var int random;
* *random = Hlp_Random (120);
* *var int Choice;
* *Choice = Hlp_Random(1);
* *// с вероятностью 0.04
* *if(random < 5)
* *{
* * * *// НПС произносит SVM фразу "... ты, правда, так думаешь..."
* * * *B_Say(self,self,"$SMALLTALK01");
* *}
* *// с вероятностью 0.04
* *else if(random < 10)
* *{
* * * *// НПС произносит SVM фразу "... все возможно..."
* * * *B_Say(self,self,"$SMALLTALK02");
* *}
* *// с вероятностью 0.04
* *else if(random < 15)
* *{
* * * *// НПС произносит SVM фразу "... он должен больше знать об этом..."
* * * *B_Say(self,self,"$SMALLTALK03");
* *}
* *// с вероятностью 0.04
* *else if(random < 20)
* *{
* * * *// НПС произносит SVM фразу "... как будто у меня и так мало проблем..."
* * * *B_Say(self,self,"$SMALLTALK04");
* *}
* *// с вероятностью 0.04
* *else if(random < 25)
* *{
* * * *// НПС произносит SVM фразу "... кто мог рассказать такое..."
* * * *B_Say(self,self,"$SMALLTALK05");
* *}
* *// с вероятностью 0.04
* *else if(random < 30)
* *{
* * * *// НПС произносит SVM фразу "... все же я еще очень зол..."
* * * *B_Say(self,self,"$SMALLTALK06");
* *}
* *// с вероятностью 0.04
* *else if(random < 35)
* *{
* * * *// НПС произносит SVM фразу "... кое-что болтают..."
* * * *B_Say(self,self,"$SMALLTALK07");
* *}
* *// с вероятностью 0.04
* *else if(random < 40)
* *{
* * * *// НПС произносит SVM фразу "... я бы не делал этого..."
* * * *B_Say(self,self,"$SMALLTALK08");
* *}
* *// с вероятностью 0.04
* *else if(random < 45)
* *{
* * * *// НПС произносит SVM фразу "... это всего лишь запах..."
* * * *B_Say(self,self,"$SMALLTALK09");
* *}
* *// с вероятностью 0.04
* *else if(random < 50)
* *{
* * * *// НПС произносит SVM фразу "... нужно узнать, что они там замышляют..."
* * * *B_Say(self,self,"$SMALLTALK10");
* *}
* *// с вероятностью 0.04
* *else if(random < 55)
* *{
* * * *// НПС произносит SVM фразу "... а я тебе что говорил..."
* * * *B_Say(self,self,"$SMALLTALK11");
* *}
* *// с вероятностью 0.04
* *else if(random < 60)
* *{
* * * *// НПС произносит SVM фразу "... меня никто не спрашивал..."
* * * *B_Say(self,self,"$SMALLTALK12");
* *}
* *// с вероятностью 0.04
* *else if(random < 65)
* *{
* * * *// НПС произносит SVM фразу "... бедный малый может и обидеть кого-нибудь..."
* * * *B_Say(self,self,"$SMALLTALK13");
* *}
* *// с вероятностью 0.04
* *else if(random < 70)
* *{
* * * *// НПС произносит SVM фразу "... ничего нового..."
* * * *B_Say(self,self,"$SMALLTALK14");
* *}
* *// с вероятностью 0.04
* *else if(random < 75)
* *{
* * * *// НПС произносит SVM фразу "... все ясно..."
* * * *B_Say(self,self,"$SMALLTALK15");
* *}
* *// с вероятностью 0.04
* *else if(random < 80)
* *{
* * * *// НПС произносит SVM фразу "... меня не нужно спрашивать..."
* * * *B_Say(self,self,"$SMALLTALK16");
* *}
* *// с вероятностью 0.04
* *else if(random < 85)
* *{
* * * *// НПС произносит SVM фразу "... так не может дальше продолжаться..."
* * * *B_Say(self,self,"$SMALLTALK17");
* *}
* *// с вероятностью 0.04
* *else if(random < 90)
* *{
* * * *// НПС произносит SVM фразу "... мое мнение ты уже знаешь..."
* * * *B_Say(self,self,"$SMALLTALK18");
* *}
* *// с вероятностью 0.04
* *else if(random < 95)
* *{
* * * *// НПС произносит SVM фразу "... я сказал то же самое..."
* * * *B_Say(self,self,"$SMALLTALK19");
* *}
* *// с вероятностью 0.04
* *else if(random < 100)
* *{
* * * *// НПС произносит SVM фразу "... вряд ли что-нибудь изменится из-за этого..."
* * * *B_Say(self,self,"$SMALLTALK20");
* *}
* *// с вероятностью 0.04
* *else if(random < 105)
* *{
* * * *// НПС произносит SVM фразу "... почему я узнаю об этом только сейчас..."
* * * *B_Say(self,self,"$SMALLTALK21");
* *}
* *// с вероятностью 0.04
* *else if(random < 110)
* *{
* * * *// если НПС маг послушник или паладин или маг огня
* * * *if(Npc_GetTrueGuild(self) == GIL_NOV) ¦¦ (Npc_GetTrueGuild(self) == GIL_PAL) ¦¦ (Npc_GetTrueGuild(self) == GIL_KDF)
* * * *{
* * * * * *// с вероятностью 0.5
* * * * * *if(Choice == 0)
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... так написано в священных книгах..."
* * * * * * * *B_Say(self,self,"$SMALLTALK28");
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... давайте посмотрим, что из этого выйдет..."
* * * * * * * *B_Say(self,self,"$SMALLTALK22");
* * * * * *};
* * * *}
* * * *// если НПС бандит или наемник или охотник на драконов или пират
* * * *else if(Npc_GetTrueGuild(self) == GIL_BDT) ¦¦ (Npc_GetTrueGuild(self) == GIL_SLD) ¦¦ (Npc_GetTrueGuild(self) == GIL_DJG)
* * * *¦¦ *(Npc_GetTrueGuild(self) == GIL_PIR)
* * * *{
* * * * * *// с вероятностью 0.5
* * * * * *if(Choice == 0)
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... он был пьянючий..."
* * * * * * * *B_Say(self,self,"$SMALLTALK25");
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... давайте посмотрим, что из этого выйдет..."
* * * * * * * *B_Say(self,self,"$SMALLTALK22");
* * * * * *};
* * * *}
* * * *else // остальные гильдии
* * * *{
* * * * * *// НПС произносит SVM фразу "... давайте посмотрим, что из этого выйдет..."
* * * * * *B_Say(self,self,"$SMALLTALK22");
* * * *}; *
* *}
* *// с вероятностью 0.04
* *else if(random < 115)
* *{
* * * *// если НПС маг послушник или паладин или маг огня
* * * *if(Npc_GetTrueGuild(self) == GIL_NOV) ¦¦ (Npc_GetTrueGuild(self) == GIL_PAL) ¦¦ (Npc_GetTrueGuild(self) == GIL_KDF)
* * * *{
* * * * * *// с вероятностью 0.5
* * * * * *if(Choice == 0)
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... я действую по приказу Инноса..."
* * * * * * * *B_Say(self,self,"$SMALLTALK29");
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... некоторые проблемы решаются сами собой..."
* * * * * * * *B_Say(self,self,"$SMALLTALK23");
* * * * * *};
* * * *}
* * * *// если НПС бандит или наемник или охотник на драконов или пират
* * * *else if(Npc_GetTrueGuild(self) == GIL_BDT) ¦¦ (Npc_GetTrueGuild(self) == GIL_SLD) ¦¦ (Npc_GetTrueGuild(self) == GIL_DJG)
* * * *¦¦ (Npc_GetTrueGuild(self) == GIL_PIR)
* * * *{
* * * * * *// с вероятностью 0.5
* * * * * *if(Choice == 0)
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... со мной бы этот номер не прошел..."
* * * * * * * *B_Say(self,self,"$SMALLTALK26");
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... некоторые проблемы решаются сами собой..."
* * * * * * * *B_Say(self,self,"$SMALLTALK23");
* * * * * *};
* * * *}
* * * *else // остальные гильдии
* * * *{
* * * * * *// НПС произносит SVM фразу "... некоторые проблемы решаются сами собой..."
* * * * * *B_Say(self,self,"$SMALLTALK23");
* * * *}; *
* *}
* *// с вероятностью 0.04
* *else if(random <= 120)
* *{ * * *
* * * *// если НПС маг послушник или паладин или маг огня
* * * *if(Npc_GetTrueGuild(self) == GIL_NOV) ¦¦ (Npc_GetTrueGuild(self) == GIL_PAL) ¦¦ (Npc_GetTrueGuild(self) == GIL_KDF)
* * * *{
* * * * * *// с вероятностью 0.5
* * * * * *if(Choice == 0)
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... никому не позволено нарушать указания богов..."
* * * * * * * *B_Say(self,self,"$SMALLTALK30");
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... я не могу больше это слушать..."
* * * * * * * *B_Say(self,self,"$SMALLTALK24");
* * * * * *};
* * * *}
* * * *// если НПС бандит или наемник или охотник на драконов или пират
* * * *else if(Npc_GetTrueGuild(self) == GIL_BDT) ¦¦ (Npc_GetTrueGuild(self) == GIL_SLD) ¦¦ (Npc_GetTrueGuild(self) == GIL_DJG)
* * * *¦¦ (Npc_GetTrueGuild (self) == GIL_PIR)
* * * *{
* * * * * *// с вероятностью 0.5
* * * * * *if(Choice == 0)
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... все убежали словно зайцы, я остался один..."
* * * * * * * *B_Say(self,self,"$SMALLTALK27");
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *// НПС произносит SVM фразу "... я не могу больше это слушать..."
* * * * * * * *B_Say(self,self,"$SMALLTALK24");
* * * * * *};
* * * *}
* * * *else // остальные гильдии
* * * *{
* * * * * *// НПС произносит SVM фразу "... я не могу больше это слушать..."
* * * * * *B_Say(self,self,"$SMALLTALK24");
* * * *}; *
* *};
};

... и ещё

// ************************************************** **************
// НПС slf произносит для НПС oth быструю SVM фразу text
// ----------------------------------------------------------------
// От B_Say() отличается только тем, что следующие AI команды будут
// выполняться не ожидая окончания фразы
// ************************************************** **************

func void B_Say_Overlay(var C_NPC slf,var C_Npc oth,var string text)
{
* *AI_OutputSVM_Overlay(slf,oth,text);
};

Ответить с цитированием
Старый 24.03.2005, 17:13   #127
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

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

Файл обновлён.
(Типа прослойка ::) )
Отправить личное сообщение для Ответить с цитированием
Старый 26.03.2005, 10:41   #128
Vam

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

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

// *******************************************
// Выбор НПС оружия соответствующего цели
// *******************************************

// ======================================
// Аргументы:
// --------------------------------------
// slf *- НПС агрессор
// oth *- НПС цель
// ======================================

func void B_SelectWeapon(var C_NPC slf,var C_NPC oth)
{
* *// если агрессор падает или плывет или ныряет
* *if(C_BodyStateContains(slf,BS_FALL)) ¦¦ (C_BodyStateContains(slf,BS_SWIM)) ¦¦ (C_BodyStateContains(slf,BS_DIVE))
* *{
* * * *return;
* *};
* *// если агрессор выбрал для использования магию
* *if(B_SelectSpell(slf,oth))
* *{
* * * *return;
* *};
* *// если агрессор находится в режиме сражения магией
* *if(Npc_IsInFightMode(slf,FMODE_MAGIC))
* *{
* * * *// если агрессор находится в боевом режиме (Примечание: не мой взгляд этот блок лишний, была проверка, что НПС использует магию)
* * * *if(!Npc_IsInFightMode(slf,FMODE_NONE))
* * * *{
* * * * * *// агрессор прячет оружие
* * * * * *AI_RemoveWeapon(slf);
* * * *};
* * * *// подготовка оружия ближнего радиуса поражения к бою
* * * *AI_ReadyMeleeWeapon (slf);
* * * *return;
* *};
* *// если агрессор находится в режиме сражения оружием дальнего радиуса поражения
* *if(Npc_IsInFightMode(slf,FMODE_FAR))
* *{
* * * *// если расстояние от агрессора до цели > дистанции, ближе которой НПС выбирает оружие ближнего радиуса поражения или агрессор не экипирован оружием ближнего радиуса поражения
* * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) ¦¦ (!Npc_HasEquippedMeleeWeapon(slf))
* * * *{
* * * * * *return;
* * * *};
* *};
* *// если агрессор находится в режиме сражения оружием ближнего радиуса поражения
* *if(Npc_IsInFightMode(slf,FMODE_MELEE))
* *{
* * * *// если расстояние от агрессора до цели > дистанции, дальше которой НПС выбирает оружие дальнего радиуса поражения или агрессор не экипирован оружием дальнего радиуса поражения
* * * *if(Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER) ¦¦ (!Npc_HasEquippedRangedWeapon(slf))
* * * *{
* * * * * *return;
* * * *};
* *};
* *// если агрессор экипирован оружием ближнего радиуса поражения и расстояние от агрессора до цели <= дистанции, дальше которой НПС выбирает оружие дальнего радиуса поражения
* *if(Npc_HasEquippedMeleeWeapon(slf)) && (Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER)
* *{
* * * *// если агрессор находится в боевом режиме
* * * *if(!Npc_IsInFightMode(slf,FMODE_NONE))
* * * *{
* * * * * *// агрессор прячет оружие
* * * * * *AI_RemoveWeapon(slf);
* * * *};
* * * *// подготовка оружия ближнего радиуса поражения к бою
* * * *AI_ReadyMeleeWeapon (slf);
* * * *return;
* *};
* *// если агрессор экипирован оружием дальнего радиуса поражения и расстояние от агрессора до цели > дистанции, ближе которой НПС выбирает оружие ближнего радиуса поражения и причина атаки агрессора - убийство жертвы
* *if(Npc_HasEquippedRangedWeapon(slf)) && (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) && (C_NpcHasAttackReasonToKill(slf))
* *{
* * * *// если агрессор находится в боевом режиме
* * * *if(!Npc_IsInFightMode(slf,FMODE_NONE))
* * * *{
* * * * * *// агрессор прячет оружие
* * * * * *AI_RemoveWeapon(slf);
* * * *};
* * * *// подготовка оружия дальнего радиуса поражения к бою
* * * *AI_ReadyRangedWeapon(slf);
* * * *return;
* *};
* *// если агрессор не в боевом режиме
* *if(Npc_IsInFightMode(slf,FMODE_NONE))
* *{
* * * *// если агрессор экипирован оружием ближнего радиуса поражения
* * * *if(Npc_HasEquippedMeleeWeapon(slf))
* * * *{
* * * * * *// подготовка оружия к бою
* * * * * *AI_ReadyMeleeWeapon(slf);
* * * * * *return;
* * * *};
* * * *// если агрессор экипирован оружием дальнего радиуса поражения
* * * *if(Npc_HasEquippedRangedWeapon(slf))
* * * *{
* * * * * *// подготовка оружия к бою
* * * * * *AI_ReadyRangedWeapon(slf);
* * * * * *return;
* * * *};
* * * *// подготовка к бою кулаками
* * * *AI_ReadyMeleeWeapon(slf);
* * * *return;
* *};
* *return;
};

... еще файл

// *********************************
// Устанавливает отношение НПС к ГГ
// *********************************

// ======================================
// Аргументы:
// --------------------------------------
// slf *- НПС
// att *- отношение
// ======================================

func void B_SetAttitude(var C_NPC slf,var int att)
{
* *// установить временное отношение НПС к ГГ
* *Npc_SetAttitude(slf,att);
* *// установить постояное отношение НПС к ГГ
* *Npc_SetTempAttitude(slf,att);
};

... и ещё

// ********************************************
// Инициализация переменной other для НПС self
// ********************************************

func void B_ValidateOther()
{
* *// если other отсутсвует (загрузка игры)
* *if(!Hlp_IsValidNpc(other))
* *{ *
* * * *// other = последней цели НПС
* * * *other = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]);
* * * *// для НПС установить цель other
* * * *Npc_SetTarget(self,other);
* * * *// установить флаг загрузки игры
* * * *self.aivar[AIV_LOADGAME] = TRUE;
* *}
* *else // иначе (other существует)
* *{ *
* * * *// повторно инициализировать other целью
* * * *Npc_GetTarget(self);
* * * *// сохранить последнюю цель
* * * *self.aivar[AIV_LASTTARGET] = Hlp_GetInstanceID(other);
* * * *// сброс флага загрузки игры
* * * *self.aivar[AIV_LOADGAME] = FALSE;
* *};
};



Добавление от 03/26/05, в 09:56:59
Криминал ГГ

// *******************************
// Запоминание новостей
// *******************************

// ======================================
// Аргументы:
// --------------------------------------
// slf  - НПС, запоминающий новость
// taeter  - НПС преступник
// crime - криминальная новость
// ======================================

func void B_MemorizePlayerCrime(var C_NPC slf,var C_NPC taeter,var int crime)
{  
   // если преступник не ГГ
   if(!Npc_IsPlayer(taeter))
   {
       return;
   };
   // если НПС черный маг
   if(slf.guild == GIL_DMT)
   {
       return;
   };
   // если новость более значима чем предыдущие новости
   if(crime > B_GetPlayerCrime(slf))
   {
       // удалить предыдущую новость
       B_DeletePetzCrime(slf);
       // добавить новость
       B_AddPetzCrime(slf,crime);
   };
   // если новость одного порядка с предыдущей новостью (Примечание: можно оставить ==, > было ранее)
   if(crime >= B_GetPlayerCrime(slf))
   {
       // НПС запоминает новость
       slf.aivar[AIV_NpcSawPlayerCommit] = crime;
       // НПС запоминает день преступления
       slf.aivar[AIV_NpcSawPlayerCommitDay] = Wld_GetDay();
       // НПС запоминает уровень криминала ГГ
       slf.aivar[AIV_CrimeAbsolutionLevel] = B_GetCurrentAbsolutionLevel(slf);
   };
};

... и ещё файл

// ************************************************** **********
// Получить последнюю новость, запомненную НПС о криминале ГГ
// ************************************************** **********

// ======================================
// Аргументы:
// --------------------------------------
// slf  - НПС имеющий новость
// --------------------------------------
// Возвращаемое значение: последняя запомненная новость
// ======================================

func int B_GetPlayerCrime(var C_NPC slf)
{
   // если уровень криминала ГГ меньше воровства
   if(slf.aivar[AIV_NpcSawPlayerCommit] <= CRIME_ATTACK)
   {
       // если с момента запоминания новости прошло более двух дней
       if(slf.aivar[AIV_NpcSawPlayerCommitDay] < (Wld_GetDay()-2))
       {
           // криминала не было
           return CRIME_NONE;
       };
   };
   // если уровень криминала, запомненный НПС, < уровня криминала ГГ по локациям
   if(slf.aivar[AIV_CrimeAbsolutionLevel] < B_GetCurrentAbsolutionLevel(slf))
   {
       // криминала не было
       return CRIME_NONE;
   };
   // последний запомненный криминал
   return slf.aivar[AIV_NpcSawPlayerCommit];
};

... и ещё

// **************************************************
// Добавить новость для соответствующей локации
// **************************************************

// ======================================
// Аргументы:
// --------------------------------------
// slf - НПС свидетель, проживающий в локации
// crime - криминальная новость
// ======================================

func void B_AddPetzCrime(var C_NPC slf,var int crime)
{
   // если НПС из Миненталя
   if(C_NpcBelongsToOldCamp(slf))
   {
       // если убийство
       if(crime == CRIME_MURDER)
       {
           // увеличить счетчик убийств
           PETZCOUNTER_OldCamp_Murder = PETZCOUNTER_OldCamp_Murder + 1;
       };
       // если воровство
       if(crime == CRIME_THEFT)
       {
           // увеличить счетчик воровства
           PETZCOUNTER_OldCamp_Theft = PETZCOUNTER_OldCamp_Theft + 1;
       };
       // если нападение
       if(crime == CRIME_ATTACK)
       {
           // увеличить счетчик нападений
           PETZCOUNTER_OldCamp_Attack = PETZCOUNTER_OldCamp_Attack + 1;
       };
       // если убийство овец
       if(crime == CRIME_SHEEPKILLER)
       {
           // увеличить счетчик убитых овец
           PETZCOUNTER_OldCamp_Sheepkiller = PETZCOUNTER_OldCamp_Sheepkiller + 1;
       };
   };
   // если НПС из Хориниса
   if(C_NpcBelongsToCity(slf))
   {
       if(crime == CRIME_MURDER)
       {
           PETZCOUNTER_City_Murder = PETZCOUNTER_City_Murder + 1;
       };
       if(crime == CRIME_THEFT)
       {
           PETZCOUNTER_City_Theft = PETZCOUNTER_City_Theft + 1;
       };
       if(crime == CRIME_ATTACK)
       {
           PETZCOUNTER_City_Attack = PETZCOUNTER_City_Attack + 1;
       };
       if(crime == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_City_Sheepkiller = PETZCOUNTER_City_Sheepkiller + 1;
       };
   };
   // если НПС из Монастыря
   if(C_NpcBelongsToMonastery(slf))
   {
       if(crime == CRIME_MURDER)
       {
           PETZCOUNTER_Monastery_Murder = PETZCOUNTER_Monastery_Murder + 1;
       };
       if(crime == CRIME_THEFT)
       {
           PETZCOUNTER_Monastery_Theft = PETZCOUNTER_Monastery_Theft + 1;
       };
       if(crime == CRIME_ATTACK)
       {
           PETZCOUNTER_Monastery_Attack = PETZCOUNTER_Monastery_Attack + 1;
       };
       if(crime == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_Monastery_Sheepkiller = PETZCOUNTER_Monastery_Sheepkiller + 1;
       };
   };
   // если НПС с Фермы наемников
   if(C_NpcBelongsToFarm(slf))
   {
       if(crime == CRIME_MURDER)
       {
           PETZCOUNTER_Farm_Murder = PETZCOUNTER_Farm_Murder + 1;
       };
       if(crime == CRIME_THEFT)
       {
           PETZCOUNTER_Farm_Theft = PETZCOUNTER_Farm_Theft + 1;
       };
       if(crime == CRIME_ATTACK)
       {
           PETZCOUNTER_Farm_Attack = PETZCOUNTER_Farm_Attack + 1;
       };
       if(crime == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_Farm_Sheepkiller = PETZCOUNTER_Farm_Sheepkiller + 1;
       };
   };
   // если НПС из Лагеря бандитов
   if(C_NpcBelongsToBL(slf))
   {
       if(crime == CRIME_MURDER)
       {
           PETZCOUNTER_BL_Murder = PETZCOUNTER_BL_Murder + 1;
       };
       if(crime == CRIME_THEFT)
       {
           PETZCOUNTER_BL_Theft = PETZCOUNTER_BL_Theft + 1;
       };
       if(crime == CRIME_ATTACK)
       {
           PETZCOUNTER_BL_Attack = PETZCOUNTER_BL_Attack + 1;
       };
   };
};

... и ещё

// ************************************************** ***********
// Удалить новость для соответствующей локации
// ************************************************** ***********

// ======================================
// Аргументы:
// --------------------------------------
// slf - НПС свидетель, проживающий в локации
// ======================================

func void B_DeletePetzCrime(var C_NPC slf)
{
   // если НПС из Миненталя
   if(C_NpcBelongsToOldCamp(slf))
   {
       // если последняя запомненная новость - убийство
       if(B_GetPlayerCrime(slf) == CRIME_MURDER)
       {
           // уменьшить счетчик убийств
           PETZCOUNTER_OldCamp_Murder = PETZCOUNTER_OldCamp_Murder - 1;
       };
       // если последняя запомненная новость - воровство
       if(B_GetPlayerCrime(slf) == CRIME_THEFT)
       {
           // уменьшить счетчик воровства
           PETZCOUNTER_OldCamp_Theft = PETZCOUNTER_OldCamp_Theft - 1;
       };
       // если последняя запомненная новость - нападение
       if(B_GetPlayerCrime(slf) == CRIME_ATTACK)
       {
           // уменьшить счетчик нападений
           PETZCOUNTER_OldCamp_Attack = PETZCOUNTER_OldCamp_Attack - 1;
       };
       // если последняя запомненная новость - убийство овец
       if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)
       {
           // уменьшить счетчик убитых овец
           PETZCOUNTER_OldCamp_Sheepkiller = PETZCOUNTER_OldCamp_Sheepkiller - 1;
       };
   };
   // если НПС из Хориниса
   if(C_NpcBelongsToCity(slf))
   {
       if(B_GetPlayerCrime(slf) == CRIME_MURDER)
       {
           PETZCOUNTER_City_Murder = PETZCOUNTER_City_Murder - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_THEFT)
       {
           PETZCOUNTER_City_Theft = PETZCOUNTER_City_Theft - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_ATTACK)
       {
           PETZCOUNTER_City_Attack = PETZCOUNTER_City_Attack - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_City_Sheepkiller = PETZCOUNTER_City_Sheepkiller - 1;
       };
   };
   // если НПС из Монастыря
   if(C_NpcBelongsToMonastery(slf))
   {
       if(B_GetPlayerCrime(slf) == CRIME_MURDER)
       {
           PETZCOUNTER_Monastery_Murder = PETZCOUNTER_Monastery_Murder - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_THEFT)
       {
           PETZCOUNTER_Monastery_Theft = PETZCOUNTER_Monastery_Theft - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_ATTACK)
       {
           PETZCOUNTER_Monastery_Attack = PETZCOUNTER_Monastery_Attack - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_Monastery_Sheepkiller = PETZCOUNTER_Monastery_Sheepkiller - 1;
       };
   };
   // если НПС с Фермы наемников
   if(C_NpcBelongsToFarm(slf))
   {
       if(B_GetPlayerCrime(slf) == CRIME_MURDER)
       {
           PETZCOUNTER_Farm_Murder = PETZCOUNTER_Farm_Murder - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_THEFT)
       {
           PETZCOUNTER_Farm_Theft = PETZCOUNTER_Farm_Theft - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_ATTACK)
       {
           PETZCOUNTER_Farm_Attack = PETZCOUNTER_Farm_Attack - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)
       {
           PETZCOUNTER_Farm_Sheepkiller = PETZCOUNTER_Farm_Sheepkiller - 1;
       };
   };
   // если НПС из Лагеря бандитов
   if(C_NpcBelongsToBL(slf))
   {
       if(B_GetPlayerCrime(slf) == CRIME_MURDER)
       {
           PETZCOUNTER_BL_Murder = PETZCOUNTER_BL_Murder - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_THEFT)
       {
           PETZCOUNTER_BL_Theft = PETZCOUNTER_BL_Theft - 1;
       };
       if(B_GetPlayerCrime(slf) == CRIME_ATTACK)
       {
           PETZCOUNTER_BL_Attack = PETZCOUNTER_BL_Attack - 1;
       };
   };
};



Добавление от 03/26/05, в 10:01:09
2DimaD:
время между склейкой теперь 20 минут
Не вводи народ в заблуждение, новый пост отредактировать не удалось, исправляйте ошибки сами, если найдете.
Предыдущее предложение по вставке разделителей (прослоек) остается. Всем привет!
Ответить с цитированием
Старый 28.03.2005, 10:41   #129
Vam

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

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

// *************************************************
// Подсчет абсолютного уровня криминала по локациям
// *************************************************

func void B_GrantAbsolution(var int location)
{
* *// если Миненталь или все локации
* *if(location == LOC_OLDCAMP) ¦¦ (location == LOC_ALL)
* *{
* * * *// абсолютный уровень по локации++
* * * *ABSOLUTIONLEVEL_OldCamp = ABSOLUTIONLEVEL_OldCamp + 1;
* * * *// сброс счетчиков криминала по локации
* * * *PETZCOUNTER_OldCamp_Murder * * *= 0;
* * * *PETZCOUNTER_OldCamp_Theft * * * = 0;
* * * *PETZCOUNTER_OldCamp_Attack * * *= 0;
* * * *PETZCOUNTER_OldCamp_Sheepkiller = 0;
* *};
* *// если Хоринис или все локации
* *if(location == LOC_CITY) ¦¦ (location == LOC_ALL)
* *{
* * * *ABSOLUTIONLEVEL_City = ABSOLUTIONLEVEL_City + 1;
* * * *PETZCOUNTER_City_Murder * * * * = 0;
* * * *PETZCOUNTER_City_Theft * * * * *= 0;
* * * *PETZCOUNTER_City_Attack * * * * = 0;
* * * *PETZCOUNTER_City_Sheepkiller * *= 0;
* *};
* *// если Монастырь или все локации
* *if(location == LOC_MONASTERY) ¦¦ (location == LOC_ALL)
* *{
* * * *ABSOLUTIONLEVEL_Monastery = ABSOLUTIONLEVEL_Monastery + 1;
* * * *PETZCOUNTER_Monastery_Murder * * * *= 0;
* * * *PETZCOUNTER_Monastery_Theft * * * * = 0; * * * *
* * * *PETZCOUNTER_Monastery_Attack * * * *= 0;
* * * *PETZCOUNTER_Monastery_Sheepkiller * = 0;
* *};
* *// если Ферма наемников или все локации
* *if(location == LOC_FARM) ¦¦ (location == LOC_ALL)
* *{
* * * *ABSOLUTIONLEVEL_Farm = ABSOLUTIONLEVEL_Farm + 1;
* * * *PETZCOUNTER_Farm_Murder * * * * = 0;
* * * *PETZCOUNTER_Farm_Theft * * * * *= 0;
* * * *PETZCOUNTER_Farm_Attack * * * * = 0;
* * * *PETZCOUNTER_Farm_Sheepkiller * *= 0;
* *};
* *// если Лагерь бандитов
* *if(location == LOC_BL)
* *{
* * * *ABSOLUTIONLEVEL_BL = ABSOLUTIONLEVEL_BL + 1;
* * * *PETZCOUNTER_BL_Murder * * * * * = 0;
* * * *PETZCOUNTER_BL_Theft * * * * * *= 0;
* * * *PETZCOUNTER_BL_Attack * * * * * = 0;
* *};
};

... ещё файл

// ************************************************** *********************
// Получить абсолютный уровень криминала для локации
// ************************************************** *********************

// ======================================
// Аргументы:
// --------------------------------------
// slf - НПС, проживающий в локации
// --------------------------------------
// Возвращаемое значение - абсолютный уровень криминала
// ======================================

func int B_GetCurrentAbsolutionLevel(var C_NPC slf)
{
* *// если НПС из Миненталя
* *if(C_NpcBelongsToOldCamp(slf))
* *{
* * * *return ABSOLUTIONLEVEL_OldCamp; * * * *
* *};
* *// если НПС из Хориниса
* *if(C_NpcBelongsToCity(slf))
* *{
* * * *return ABSOLUTIONLEVEL_City; * * * * * *
* *};
* *// если НПС из Монастыря
* *if(C_NpcBelongsToMonastery(slf))
* *{
* * * *return ABSOLUTIONLEVEL_Monastery; * * *
* *};
* *// если НПС с Фермы наемников
* *if(C_NpcBelongsToFarm(slf))
* *{
* * * *return ABSOLUTIONLEVEL_Farm;
* *};
* *// если НПС из Лагеря бандитов
* *if(C_NpcBelongsToBL(slf))
* *{
* * * *return ABSOLUTIONLEVEL_BL;
* *};
* *return 0;
};

... и ещё

// *************************************************
// Получить суммарный уровень криминала по локациям
// *************************************************

// ======================================
// Аргументы:
// --------------------------------------
// slf - НПС, проживающий в локации
// --------------------------------------
// Возвращаемое значение - суммарный уровень криминала ГГ для локации
// ======================================

func int B_GetTotalPetzCounter(var C_NPC slf)
{
* *// если НПС из Миненталя
* *if (C_NpcBelongsToOldCamp(slf))
* *{
* * * *// суммарный уровень криминала для локации
* * * *return (PETZCOUNTER_OldCamp_Murder + PETZCOUNTER_OldCamp_Theft + PETZCOUNTER_OldCamp_Attack + PETZCOUNTER_OldCamp_Sheepkiller);
* *};
* *// если НПС из Хориниса
* *if (C_NpcBelongsToCity(slf))
* *{
* * * *return (PETZCOUNTER_City_Murder + PETZCOUNTER_City_Theft + PETZCOUNTER_City_Attack + PETZCOUNTER_City_Sheepkiller);
* *};
* *// если НПС из Монастыря
* *if (C_NpcBelongsToMonastery(slf))
* *{
* * * *return (PETZCOUNTER_Monastery_Murder + PETZCOUNTER_Monastery_Theft + PETZCOUNTER_Monastery_Attack + PETZCOUNTER_Monastery_Sheepkiller);
* *};
* *// если НПС с Фермы наемников
* *if (C_NpcBelongsToFarm(slf))
* *{
* * * *return (PETZCOUNTER_Farm_Murder + PETZCOUNTER_Farm_Theft + PETZCOUNTER_Farm_Attack + PETZCOUNTER_Farm_Sheepkiller);
* *};
* *// если НПС из Лагеря бандитов
* *if (C_NpcBelongsToBL(slf))
* *{
* * * *return (PETZCOUNTER_BL_Murder + PETZCOUNTER_BL_Theft + PETZCOUNTER_BL_Attack);
* *};
* *return 0;
};

... и еще

// ************************************************** *******
// Получить криминал ГГ по локациям и в порядке приоритетов
// ************************************************** *******

// ======================================
// Аргументы:
// --------------------------------------
// slf - НПС, проживающий в локации
// --------------------------------------
// Возвращаемое значение - приоритетный криминал для локации
// ======================================

func int B_GetGreatestPetzCrime(var C_NPC slf)
{
* *// если НПС из Миненталя
* *if(C_NpcBelongsToOldCamp(slf))
* *{
* * * *// если счетчик убийств > 0
* * * *if(PETZCOUNTER_OldCamp_Murder > 0)
* * * *{
* * * * * *// криминал - убийство
* * * * * *return CRIME_MURDER;
* * * *};
* * * *// если счетчик воровства > 0
* * * *if(PETZCOUNTER_OldCamp_Theft > 0)
* * * *{
* * * * * *// криминал - воровство
* * * * * *return CRIME_THEFT;
* * * *};
* * * *// если счетчик нападений > 0
* * * *if(PETZCOUNTER_OldCamp_Attack > 0)
* * * *{
* * * * * *// криминал - нападение
* * * * * *return CRIME_ATTACK;
* * * *};
* * * *// если счетчик убийств овец > 0
* * * *if(PETZCOUNTER_OldCamp_Sheepkiller > 0)
* * * *{
* * * * * *// криминал - убийство овец
* * * * * *return CRIME_SHEEPKILLER;
* * * *};
* *};
* *// если НПС из Хориниса
* *if(C_NpcBelongsToCity(slf))
* *{
* * * *if(PETZCOUNTER_City_Murder > 0)
* * * *{
* * * * * *return CRIME_MURDER;
* * * *};
* * * *if(PETZCOUNTER_City_Theft > 0)
* * * *{
* * * * * *return CRIME_THEFT;
* * * *};
* * * *if(PETZCOUNTER_City_Attack > 0)
* * * *{
* * * * * *return CRIME_ATTACK;
* * * *};
* * * *if(PETZCOUNTER_City_Sheepkiller > 0)
* * * *{
* * * * * *return CRIME_SHEEPKILLER;
* * * *};
* *};
* *// если НПС из Монастыря
* *if(C_NpcBelongsToMonastery(slf))
* *{
* * * *if(PETZCOUNTER_Monastery_Murder > 0)
* * * *{
* * * * * *return CRIME_MURDER;
* * * *};
* * * *if(PETZCOUNTER_Monastery_Theft > 0)
* * * *{
* * * * * *return CRIME_THEFT;
* * * *};
* * * *if(PETZCOUNTER_Monastery_Attack > 0)
* * * *{
* * * * * *return CRIME_ATTACK;
* * * *};
* * * *if(PETZCOUNTER_Monastery_Sheepkiller > 0)
* * * *{
* * * * * *return CRIME_SHEEPKILLER;
* * * *};
* *};
* *// если НПС с Фермы наемников
* *if(C_NpcBelongsToFarm(slf))
* *{
* * * *if(PETZCOUNTER_Farm_Murder > 0)
* * * *{
* * * * * *return CRIME_MURDER;
* * * *};
* * * *if(PETZCOUNTER_Farm_Theft > 0)
* * * *{
* * * * * *return CRIME_THEFT;
* * * *};
* * * *if(PETZCOUNTER_Farm_Attack > 0)
* * * *{
* * * * * *return CRIME_ATTACK;
* * * *};
* * * *if(PETZCOUNTER_Farm_Sheepkiller > 0)
* * * *{
* * * * * *return CRIME_SHEEPKILLER;
* * * *};
* *};
* *// если НПС из Лагеря бандитов
* *if(C_NpcBelongsToBL(slf))
* *{
* * * *if(PETZCOUNTER_BL_Murder > 0)
* * * *{
* * * * * *return CRIME_MURDER;
* * * *};
* * * *if(PETZCOUNTER_BL_Theft > 0)
* * * *{
* * * * * *return CRIME_THEFT;
* * * *};
* * * *if(PETZCOUNTER_BL_Attack > 0)
* * * *{
* * * * * *return CRIME_ATTACK;
* * * *};
* *};
* *return CRIME_NONE;
};

Ответить с цитированием
Старый 29.03.2005, 11:02   #130
Vam

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

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

13. Вспомогательные С_ функции для людей (compare функции).

Все С_ функции расположены в директории ..\AI\Human\С_Human\

Следующие два файла можно удалить по причине их бесполезности C_BanditAttackBandit.d и C_BanditHelpsStoryBandit.d

// ************************************************** ******************
// Проверка состояния тела НПС
// --------------------------------------------------------------------
// Примечание автора: Никогда не используйте встроенную функцию Npc_GetBodyState
// напрямую, т.к. сравнение всегда будет ложно, если установлены дополнительные
// флаги состояния тела. Все запросы на состояние тела выполняйте только
// через эту функцию.
// ************************************************** ******************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - НПС, состояние тела которого проверяется
// bodystate - проверяемое состояние тела
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - состояние тела НПС совпадает с проверяемым, FALSE - не совпадает
// ================================================== ==================

func int C_BodyStateContains(var C_NPC slf,var int bodystate)
{
* *// Примечание автора: Руки прочь от этой формулы!!! Я знаю точно что я делаю! (Мое примечание: с точки зрения логического анализа формула неправильна).
* *// если фактическое состояние тела НПС без учета допфлагов равно запрошенному состоянию без учета допфлагов
* *if((Npc_GetBodyState(slf)&(BS_MAX¦BS_FLAG_INTERRU PTABLE¦BS_FLAG_FREEHA
NDS)) == (bodystate&(BS_MAX¦BS_FLAG_INTERRUPTABLE¦BS_FLAG_F REEHANDS)))
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// ************************************************** ******************************
// Убивается ли НПС по окончании жизни или переводится в бессознательное состояние
// ************************************************** ******************************

// ================================================== ==================
// self - проверяемый НПС
// other - преступник, убивающий НПС
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - НПС не убивается преступником, FALSE - убивается.
// ================================================== ==================

func int C_DropUnconscious()
{
* *// если преступник монстр или Черный маг (Ищущий) или бандит или преступнику разрешено убить НПС
* *if(other.guild > GIL_SEPERATOR_HUM) ¦¦ (other.guild == GIL_DMT) ¦¦ (other.guild == GIL_BDT) ¦¦ (other.aivar[AIV_DropDeadAndKill] == TRUE)
* *{
* * * *// НПС будет убит
* * * *return FALSE;
* *};
* *// если НПС человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// если НПС не Черный маг и не бандит и его не разрешено убивать преступнику
* * * *if(self.guild != GIL_DMT) && (self.guild != GIL_BDT) && (self.aivar[AIV_DropDeadAndKill] == FALSE)
* * * *{
* * * * * *// НПС будет безсознания
* * * * * *return TRUE;
* * * *};
* *};
* *// НПС будет убит
* *return FALSE;
};

... и ещё

// ************************************************** ***************
// Может ли быть взят предмет, принадлежащий одному НПС, другим НПС
// ************************************************** ***************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - НПС, которому может принадлежать предмет
// oth - НПС берущий предмет (ГГ)
// itm - предмет
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - предмет взять нельзя, FALSE - взять можно.
// ================================================== ==================

func int C_IsTakenItemMyPossession(var C_NPC slf,var C_NPC oth,var C_ITEM itm)
{
* *var int portalguild;
* *// получить номер гильдии, которой принадлежит помещение (-1 помещение никому не принадлежит)
* *portalguild = Wld_GetPlayerPortalGuild();
* *// Моё примечание: предыдущие две строки лишние и могут быть удалены.
* *// если предмет принадлежит НПС владельцу
* *if(Npc_OwnedByNpc(itm,slf))
* *{
* * * *// если предмет Святой молот
* * * *if(Hlp_IsItem(itm,Holy_Hammer_MIS))
* * * *{
* * * * * *// Святой молот взят
* * * * * *Hammer_Taken = TRUE;
* * * *};
* * * *// брать нельзя
* * * *return TRUE;
* *};
* *// если предмет выброшен (просто валяется)
* *if((itm.flags & ITEM_DROPPED) == ITEM_DROPPED)
* *{
* * * *// брать можно
* * * *return FALSE;
* *};
* *// если ГГ находится в помещении, принадлежащем НПС или помещение публично
* *// Моё примечание: правильнее вместо self написать slf, а то в некоторых случаях может быть ошибка.
* *if(C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ (Wld_GetPlayerPortalGuild() == GIL_PUBLIC)
* *{
* * * *// брать нельзя
* * * *return TRUE;
* *}; *
* *// если отношения между гильдиями НПС и гильдией, владеющей предметом, дружественные
* *if(Wld_GetGuildAttitude(slf.guild,itm.ownerguild) == ATT_FRIENDLY)
* *{
* * * *// брать нельзя
* * * *return TRUE;
* *};
* *// брать можно
* *return FALSE;
};

... и ещё

// ************************************************** **************
// Можно ли импользовать MOB, принадлежащий одному НПС, другим НПС
// ************************************************** **************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - НПС, которому может принадлежать MOB
// oth - НПС использующий MOB (ГГ)
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - MOB использовать нельзя, FALSE - можно.
// ================================================== ==================

func int C_IsUsedMobMyPossession(var C_NPC slf,var C_NPC oth)
{
* *// Моё примечание: правильнее вместо self и other внутри функции написать slf и oth, а то в некоторых случаях может быть ошибка.
* *// если MOB, используемый ГГ, принадлежит НПС
* *if(Npc_IsDetectedMobOwnedByNpc(other,self))
* *{
* * * *// нельзя
* * * *return TRUE;
* *};
* *// если ГГ находится в помещении, принадлежащем НПС или помещение публично
* *if(C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ (Wld_GetPlayerPortalGuild() == GIL_PUBLIC)
* *{
* * * *// нельзя
* * * *return TRUE;
* *}; *
* *// можно
* *return FALSE;
};

Ответить с цитированием
Старый 30.03.2005, 12:13   #131
Vam

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

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

// ************************************************** ******************
// Функции проверяющие принадлежность НПС к определенной локации
// ************************************************** ******************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - принадлежит, FALSE - нет.
// ================================================== ==================

// Проверка принадлежности к Миненталю
// --------------------------------------------------------------------
func int C_NpcBelongsToOldCamp(var C_NPC slf)
{
* *// если НПС значим или из окружающего народа в Минентале
* *if(slf.npctype == NPCTYPE_OCMAIN) ¦¦ (slf.npctype == NPCTYPE_OCAMBIENT)
* *{
* * * *// если НПС Горожанин или Милиционер или Паладин
* * * *if(slf.guild == GIL_VLK) ¦¦ (slf.guild == GIL_MIL) ¦¦ (slf.guild == GIL_PAL)
* * * *{
* * * * * *return TRUE;
* * * *};
* *};
* *return FALSE;
};

// Проверка принадлежности к Хоринису
// --------------------------------------------------------------------
func int C_NpcBelongsToCity(var C_NPC slf)
{
* *// если НПС не из Миненталя
* *if(!C_NpcBelongsToOldCamp(slf))
* *{
* * * *// если НПС Горожанин или Милиционер или Паладин
* * * *if(slf.guild == GIL_VLK) ¦¦ (slf.guild == GIL_MIL) ¦¦ (slf.guild == GIL_PAL)
* * * *{
* * * * * *return TRUE;
* * * *};
* *};
* *return FALSE;
};

// Проверка принадлежности к Монастырю
// ---------------------------------------------------------------------
func int C_NpcBelongsToMonastery(var C_NPC slf)
{
* *// если НПС Маг огня или Маг послушник
* *if(slf.guild == GIL_KDF) ¦¦ (slf.guild == GIL_NOV)
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

// Проверка принадлежности к Ферме наемников
// ---------------------------------------------------------------------
func int C_NpcBelongsToFarm(var C_NPC slf)
{
* *// если НПС Крестьянин или Наемник
* *if(slf.guild == GIL_BAU) ¦¦ (slf.guild == GIL_SLD)
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

// Проверка принадлежности к Лагерю бандитов
// ---------------------------------------------------------------------
func int C_NpcBelongsToBL(var C_NPC slf)
{
* *// если НПС из окружающего народа в Лагере или Долине бандитов
* *if(slf.npctype == NPCTYPE_BL_AMBIENT) ¦¦ (slf.npctype == NPCTYPE_BL_MAIN)
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// ******************************************
// Имеет ли НПС новости об окружающей жизни
// ******************************************

// ==========================================
// Аргументы:
// ------------------------------------------
// slf - проверяемый НПС
// ------------------------------------------
// Возвращаемое значение:
// TRUE - новости есть, FALSE - нет.
// ==========================================

func int C_NpcHasAmbientNews(var C_NPC slf)
{ * * *
* *// если НПС не знает никаких новостей
* *if(slf.aivar[AIV_NewsOverride] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если ГГ не имеет криминала
* *if(B_GetPlayerCrime(slf) == CRIME_NONE)
* *{
* * * *return FALSE;
* *};
* *// новости есть (по умолчанию)
* *return TRUE;
};

... ещё файл

// *****************************************
// Является ли причиной атаки убийство цели
// *****************************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - НПС агрессор
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - причина атаки - убийство, FALSE - нет.
// ================================================== ==================

func int C_NpcHasAttackReasonToKill(var C_NPC slf)
{
* *// если
* *if (slf.aivar[AIV_ATTACKREASON] == AR_KILL) * * * * * * * * // ГГ убил НПС
* *¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_GuildEnemy) * * * * * // или НПС является врагом гильдии
* *¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman) * // или Человек убил человека
* *¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_GuardStopsIntruder) * // или Охрана ворот атакует незваного гостя
* *¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_GuardCalledToKill) * *// или Вызвана охрана по факту убийства
* *{
* * * *return TRUE; * *
* *};
* *return FALSE;
};

... ещё файл

// ************************************
// Находится ли ГГ в частном помещении
// ************************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - НПС, которому может принадлежать помещение
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - ГГ в частном помещении, FALSE - нет.
// ================================================== ==================

func int C_NpcIsBotheredByPlayerRoomGuild(var C_Npc slf)
{ *
* *var int portalguild;
* *// получить номер гильдии, которой принадлежит помещение (-1 помещение никому не принадлежит)
* *portalguild = Wld_GetPlayerPortalGuild();
* *// если помещение принадлежит гильдии и (НПС из этой гильдии или гильдия НПС и гильдия, владеющая помещением, дружественны)
* *if(portalguild > GIL_NONE) && ((slf.guild == portalguild) ¦¦ (Wld_GetGuildAttitude(slf.guild,portalguild) == ATT_FRIENDLY))
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// ************************************************** ***************
// Реагирует ли цель на оружие, направленное против нее агрессором
// ************************************************** ***************

// ================================================== ===============
// Аргументы:
// -----------------------------------------------------------------
// slf - НПС цель
// oth - НПС агрессор
// -----------------------------------------------------------------
// Возвращаемое значение:
// TRUE - цель реагирует, FALSE - нет.
// ================================================== ===============

func int C_NpcIsBotheredByWeapon(var C_NPC slf,var C_NPC oth)
{
* *// если цель член партии ГГ
* *if(slf.aivar[AIV_PARTYMEMBER] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если цель друг ГГ и агрессор ГГ (Примечание: правильней вместо other написать oth)
* *if(slf.npctype == NPCTYPE_FRIEND) && (Npc_IsPlayer(other))
* *{
* * * *return FALSE;
* *};
* *// если НПС имеет дело с "крутым парнем" и агрессор сражается оружием ближнего радиуса поражения
* *if(C_NpcIsToughGuy(slf)) && (Npc_IsInFightMode(oth,FMODE_MELEE))
* *{
* * * *return FALSE;
* *};
* *// если отношения между агрессором и целью дружественны
* *if(Npc_GetAttitude(slf,oth) == ATT_FRIENDLY)
* *{
* * * *return FALSE;
* *};
* *// если цель является охранником ворот
* *if(C_NpcIsGateGuard(slf))
* *{
* * * *return FALSE;
* *};
* *// если агрессор сражается кулаками
* *if(Npc_IsInFightMode(oth,FMODE_FIST)) * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *{
* * * *return FALSE;
* *};
* *// если агрессор использует магию и категория используемого заклинания безвредна
* *if(Npc_IsInFightMode(oth,FMODE_MAGIC) && (Npc_GetActiveSpellCat(oth) != SPELL_BAD))
* *{
* * * *return FALSE;
* *};
* *// если цель Черный маг или орк
* *if((slf.guild == GIL_DMT) ¦¦ (slf.guild == GIL_ORC))
* *{
* * * *return FALSE;
* *}; *
* *return TRUE;
};

Ответить с цитированием
Старый 31.03.2005, 11:23   #132
Vam

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

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

// **********************************************
// Находится ли НПС в бессознательном состоянии
// **********************************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - НПС в бессознательном состоянии (обездвижен), FALSE - нет.
// ================================================== ==================

func int C_NpcIsDown(var C_NPC slf)
{
* *// если НПС безсознания или в магическом сне или убит
* *if(Npc_IsInState(slf,ZS_Unconscious) ¦¦ Npc_IsInState(slf,ZS_MagicSleep) ¦¦ Npc_IsDead(slf))
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// ***********************************
// Является ли НПС источником зла
// ***********************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - НПС - источник зла, FALSE - нет.
// ================================================== ==================

func int C_NpcIsEvil(var C_NPC slf)
{
* *// если НПС
* *if (slf.guild == GIL_DMT) * * * * * * * * * * * * * // Черный маг
* *¦¦ (slf.guild == GIL_DRAGON) * * * * * * * * * * * *// или дракон
* *¦¦ (slf.guild == GIL_ORC) * * * * * * * * * * * * * // или орк
* *¦¦ (slf.guild == GIL_DRACONIAN) * * * * * * * * * * // или ящер
* *¦¦ (slf.guild == GIL_DEMON) * * * * * * * * * * * * // или демон
* *¦¦ (slf.guild == GIL_SUMMONED_DEMON) * * * * * * * *// или вызванный демон
* *¦¦ (slf.aivar[AIV_MM_REAL_ID] == ID_TROLL_BLACK) * *// или Черный троль
* *¦¦ (C_NpcIsUndead(slf)) * * * * * * * * * * * * * * // или НПС является нежитью
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// *************************************
// Является ли НПС охранником ворот
// *************************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_NpcIsGateGuard(var C_NPC slf)
{
* *// если НПС находится в состоянии охраны ворот
* *if(Npc_IsInState(slf,ZS_Guard_Passage))
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// *************************************
// Является ли НПС ГГ
// *************************************

// =====================================
// Аргументы:
// -------------------------------------
// slf - проверяемый НПС
// -------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// =====================================

func int C_NpcIsHero(var C_NPC slf)
{
* *var C_NPC her;
* *// получить ссылку на ГГ
* *her = Hlp_GetNpc(PC_Hero);
* *// если идентификаторы НПС и ГГ равны
* *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(her))
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// ***********************************************
// Является ли НПС "крутым парнем"
// ***********************************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_NpcIsToughGuy(var C_NPC slf)
{
* *// если установлен признак "крутого парня"
* *if(slf.aivar[AIV_ToughGuy] == TRUE)
* *{
* * * *return TRUE;
* *};
* *// если НПС наемник или охотник на драконов или бандит или пират
* *if(slf.guild == GIL_SLD) ¦¦ (slf.guild == GIL_DJG) ¦¦ (slf.guild == GIL_BDT) ¦¦ (slf.guild == GIL_PIR)
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// ***************************************
// Является ли НПС нежитью
// ***************************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_NpcIsUndead(var C_NPC slf)
{
* *// если НПС
* * if (slf.guild == GIL_GOBBO_SKELETON) * * * * * * * // Скелет гоблина
* * ¦¦ (slf.guild == GIL_SUMMONED_GOBBO_SKELETON) * * *// или Вызванный скелет гоблина
* * ¦¦ (slf.guild == GIL_SKELETON) * * * * * * * * * * // или Скелет
* * ¦¦ (slf.guild == GIL_SUMMONED_SKELETON) * * * * * *// или Вызванный скелет
* * ¦¦ (slf.guild == GIL_SKELETON_MAGE) * * * * * * * *// или Скелет маг
* * ¦¦ (slf.guild == GIL_ZOMBIE) * * * * * * * * * * * // или Зомби
* * ¦¦ (slf.guild == GIL_SHADOWBEAST_SKELETON) * * * * // или Скелет мракориса
* * ¦¦ (slf.guild == GIL_UNDEADORC) * * * * * * * * * *// или Орк нежить
* * ¦¦ (slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_UNDEAD) // или Дракон нежить
* * {
* * * *return TRUE;
* * };
* * return FALSE;
};


Ответить с цитированием
Старый 02.04.2005, 10:07   #133
Vam

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

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

Система шутить перестала, можно перейти и к делу.

// ************************************************
// Должен ли НПС обыскать тело
// ************************************************

// ================================================
// Аргументы:
// ------------------------------------------------
// slf - обыскивающий НПС
// неявно: other - обыскиваемый НПС (цель)
// ------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================

func int C_NpcRansacksAlways(var C_Npc slf)
{
* *// если НПС Гарвиг и цель имеет "Святой молот"
* *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Garwig)) && (Npc_HasItems(other,Holy_Hammer_MIS) > 0)
* *{
* * * *return TRUE;
* *};
* *// если НПС Род и цель имеет "Меч Рода"
* *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Rod)) && (Npc_HasItems(other,ItMw_2h_Rod) > 0)
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// ************************************************** ******************
// Является ли НПС членом подставной гильдии
// ************************************************** ******************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - НПС определяющий подставу
// oth - проверяемый НПС (обычно ГГ)
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да (определяется что ГГ переодет), FALSE - нет.
// ================================================== ==================

func int C_PlayerHasFakeGuild(var C_NPC slf,var C_NPC oth)
{
* *var C_Item itm;
* *// получить доспехи ГГ
* *itm = Npc_GetEquippedArmor(oth);
* *// Примечание: следующие две строки не нужны при условии коррекции функции ниже
* *var int NSC_CommentRangerArmor;
* *NSC_CommentRangerArmor = TRUE;
* *// если НПС игнорирует доспехи, в которые одет ГГ
* *if(slf.aivar[AIV_IgnoresArmor] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если НПС игнорирует подставную гильдию
* *if(slf.aivar[AIV_IgnoresFakeGuild] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если НПС является охранником ворот (Примечание: правильнее вместо self написать slf)
* *if(C_NpcIsGateGuard(self) == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если НПС бандит и ГГ переодетый в бандита
* *if(slf.guild == GIL_BDT) && C_PlayerIsFakeBandit(slf,oth)
* *{
* * * *// если ГГ без брони
* * * *if(Npc_HasEquippedArmor(oth) == FALSE)
* * * *{
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *return FALSE;
* * * *};
* *}; *
* *// если ГГ без брони
* *if(Npc_HasEquippedArmor(oth) == FALSE)
* *{
* * * *return FALSE;
* *}
* *// если гильдии НПС и ГГ одинаковы (Примечание: else здесь лишнее)
* *else if(slf.guild == oth.guild)
* *{
* * * *// если доспехи ГГ "Кольчуга 'Кольца Воды'"
* * * *if(Hlp_IsItem(itm,ITAR_RANGER_Addon) == TRUE)
* * * *{
* * * * * *// Примечание: выполняется всегда, поэтому условие if можно удалить, оставив только return TRUE;
* * * * * *if(NSC_CommentRangerArmor == TRUE)
* * * * * *{
* * * * * * * *return TRUE;
* * * * * *}
* * * * * *// Примечание: блок else можно удалить
* * * * * *else
* * * * * *{
* * * * * * * *return FALSE;
* * * * * *}; *
* * * *};
* * * *// если ГГ не принадлежит к гильдии и одет в
* * * *if(oth.guild == GIL_NONE)
* * * *&& ((Hlp_IsItem(itm,ITAR_VLK_L) == TRUE) * * * *// "Одежду горожанина"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_VLK_M) == TRUE) * * * * // или "Одежду горожанина"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_VLK_H) == TRUE) * * * * // или "Одежду горожанина" (Примечание: кто может пояснить, чем отличаются эти одежды?)
* * * *¦¦ (Hlp_IsItem(itm,ITAR_BAU_L) == TRUE) * * * * // или "Одежду крестьянина"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_BAU_M) == TRUE) * * * * // или "Одежду крестьянина 2"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_Leather_L) == TRUE)) * *// или "Кожаные доспехи"
* * * *{
* * * * * *return FALSE;
* * * *}
* * * *// Примечание: далее до конца блока все else можно удалить
* * * *// если ГГ милиционер и одет в
* * * *else if(oth.guild == GIL_MIL)
* * * *&& ((Hlp_IsItem(itm,ITAR_MIL_L) == TRUE) * * * *// "Легкие доспехи ополчения"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_MIL_M) == TRUE)) * * * *// или "Тяжелые доспехи ополчения"
* * * *{
* * * * * *return FALSE;
* * * *}
* * * *// если ГГ паладин и одет в
* * * *else if(oth.guild == GIL_PAL)
* * * *&& ((Hlp_IsItem(itm,ITAR_PAL_M) == TRUE) * * * *// "Доспехи паладина"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_PAL_H) == TRUE)) * * * *// или "Доспехи паладина" (улучшенные)
* * * *{
* * * * * *return FALSE;
* * * *}
* * * *// если ГГ наемник и одет в
* * * *else if(oth.guild == GIL_SLD)
* * * *&& ((Hlp_IsItem(itm,ITAR_SLD_L) == TRUE) * * * *// "Легкие доспехи наемника"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_SLD_M) == TRUE) * * * * // или "Средние доспехи наемника"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_SLD_H) == TRUE)) * * * *// или "Тяжелые доспехи наемника"
* * * *{
* * * * * *return FALSE;
* * * *}
* * * *// если ГГ охотник на драконов и одет в
* * * *else if(oth.guild == GIL_DJG)
* * * *&& ((Hlp_IsItem(itm,ITAR_SLD_L) == TRUE) * * * *// "Легкие доспехи наемника"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_SLD_M) == TRUE) * * * * // или "Средние доспехи наемника"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_SLD_H) == TRUE) * * * * // или "Тяжелые доспехи наемника"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_DJG_L) == TRUE) * * * * // или "Легкие доспехи охотника на драконов"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_DJG_M) == TRUE) * * * * // или "Средние доспехи охотника на драконов"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_DJG_H) == TRUE) * * * * // или "Тяжелые доспехи охотника на драконов"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_DJG_Crawler) == TRUE)) *// или "Доспехи из панцирей ползунов"
* * * *{
* * * * * *return FALSE;
* * * *}
* * * *// если ГГ маг послушник и одет в "Робу послушника"
* * * *else if(oth.guild == GIL_NOV) && (Hlp_IsItem(itm,ITAR_NOV_L) == TRUE)
* * * *{
* * * * * *return FALSE;
* * * *}
* * * *// если ГГ маг огня и одет в
* * * *else if(oth.guild == GIL_KDF)
* * * *&& ((Hlp_IsItem(itm,ITAR_KDF_L) == TRUE) * * * *// "Робу мага огня"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_KDF_H) == TRUE)) * * * *// или "Тяжелую робу огня"
* * * *{
* * * * * *return FALSE;
* * * *}
* * * *else
* * * *{
* * * * * *return TRUE;
* * * *}; *
* *};
* *return FALSE;
}; * * *

... ещё файл

// ************************************************** ******************
// Является ли НПС членом гильдии бандитов
// ************************************************** ******************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - НПС определяющий подставу
// oth - проверяемый НПС (обычно ГГ)
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да (ГГ "принадлежит" к бандитам), FALSE - нет.
// ================================================== ==================

func int C_PlayerIsFakeBandit(var C_NPC slf,var C_NPC oth)
{
* *var C_Item itm;
* *// если НПС игнорирует доспехи, в которые одет ГГ
* *if(slf.aivar[AIV_IgnoresArmor] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если НПС игнорирует подставную гильдию
* *if(slf.aivar[AIV_IgnoresFakeGuild] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если НПС пират
* *if(slf.guild == GIL_PIR)
* *{
* * * *return FALSE;
* *}; *
* *// если ГГ одет в броню
* *if(Npc_HasEquippedArmor(oth) == TRUE)
* *{
* * * *// получить доспехи ГГ
* * * *itm = Npc_GetEquippedArmor(oth);
* * * *// если доспехи ГГ
* * * *if((Hlp_IsItem(itm,ITAR_BDT_M) == TRUE) * * * * // "Средняя бандитская кольчуга"
* * * *¦¦ (Hlp_IsItem(itm,ItAR_Thorus_Addon) == TRUE) *// или "Тяжелая кольчуга гардиста"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_BDT_H) == TRUE)) * * * *// или "Тяжелая бандитская кольчуга"
* * * *{
* * * * * *return TRUE;
* * * *};
* * * *return FALSE;
* *}
* *// если НПС бандит и текущий уровень - Яркендар и ГГ может разговаривать с бандитами (Равен убит)
* *if(slf.guild == GIL_BDT) && (CurrentLevel == ADDONWORLD_ZEN) && (Player_HasTalkedToBanditCamp == TRUE)
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// ************************************************** ******************
// Является ли НПС членом гильдии пиратов
// ************************************************** ******************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - НПС определяющий подставу
// oth - проверяемый НПС (обычно ГГ)
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да (ГГ "принадлежит" к пиратам), FALSE - нет.
// ================================================== ==================

func int C_PlayerIsFakePirate(var C_NPC slf,var C_NPC oth)
{
* *var C_Item itm;
* *// если НПС игнорирует доспехи, в которые одет ГГ
* *if(slf.aivar[AIV_IgnoresArmor] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если НПС игнорирует подставную гильдию
* *if(slf.aivar[AIV_IgnoresFakeGuild] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если ГГ одет в броню (Примечание: правильнее вместо other написать oth)
* *if(Npc_HasEquippedArmor(other) == TRUE)
* *{
* * * *// получить доспехи ГГ
* * * *itm = Npc_GetEquippedArmor(oth);
* * * *// если доспехи ГГ
* * * *if((Hlp_IsItem(itm,ITAR_PIR_L_Addon) == TRUE) * // "Одежда пирата"
* * * *¦¦ (Hlp_IsItem(itm,ItAR_PIR_M_Addon) == TRUE) * // или "Доспехи пирата"
* * * *¦¦ (Hlp_IsItem(itm,ITAR_PIR_H_Addon) == TRUE)) *// или "Одежда капитана"
* * * *{
* * * * * *return TRUE;
* * * *};
* *};
* *return FALSE;
};

Ответить с цитированием
Старый 02.04.2005, 12:13   #134
PA
Строители Миртаны
*
 
Регистрация: 29.08.2004
Сообщений: 1
PA вне форума

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

2Vam:
// если ГГ не принадлежит к гильдии и одет в
* * * if(oth.guild == GIL_NONE)
* * * && ((Hlp_IsItem(itm,ITAR_VLK_L) == TRUE) * * * *// "Одежду горожанина"
* * * ¦¦ (Hlp_IsItem(itm,ITAR_VLK_M) == TRUE) * * * * // или "Одежду горожанина"
* * * ¦¦ (Hlp_IsItem(itm,ITAR_VLK_H) == TRUE) * * * * // или "Одежду горожанина" (Примечание: кто может пояснить, чем отличаются эти одежды?)
Существуют 3-и вида одежды горожанина...
Различие только чисто внешнее но по идее - победнее, средняя и побогаче.

Ответить с цитированием
Старый 04.04.2005, 10:47   #135
Vam

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

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

// *************************************************
// Отказывается ли НПС от предлагаемого разговора
// *************************************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - НПС, которому предложили разговор
// oth - инициатор разговора (обычно ГГ)
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_RefuseTalk(var C_NPC slf,var C_NPC oth)
{
* *// если НПС не может говорить и он охраняет ворота и он не выдавал предупреждений
* *if(Npc_RefuseTalk(slf) == TRUE) && (C_NpcIsGateGuard(slf)) && (slf.aivar[AIV_Guardpassage_Status] == GP_NONE)
* *{
* * * *return TRUE;
* *};
* *
* *// если НПС с ГГ не разговаривал и НПС находится от своего вайпоинта далее 5м
* *if(slf.aivar[AIV_TalkedToPlayer] == FALSE) && (Npc_GetDistToWP(slf,slf.wp) > 500)
* *{
* * * *// если НПС Лотар
* * * *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Lothar))
* * * *{
* * * * * *return TRUE;
* * * *};
* *};
* *// если НПС определил, что ГГ член подставной гильдии и НПС неуязвимый (Примечание: необходимо self заменить на slf)
* *if(C_PlayerHasFakeGuild(slf,oth) && (self.flags != NPC_FLAG_IMMORTAL)
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// *************************************
// Должен ли НПС атаковать убийцу
// *************************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// oth - НПС убийца (обычно ГГ)
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_WantToAttackMurder(var C_NPC slf,var C_NPC oth)
{
* *// если НПС Черный маг или Заключенный или Охотник на драконов или Бандит
* *if(slf.guild == GIL_DMT) ¦¦ (slf.guild == GIL_STRF) ¦¦ (slf.guild == GIL_DJG) ¦¦ (slf.guild == GIL_BDT) *
* *{
* * * *return FALSE;
* *};
* *// если НПС игнорирует убийство
* *if(slf.aivar[AIV_IGNORE_Murder] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если убийца ГГ и НПС ему друг
* *if(Npc_IsPlayer(oth) && (slf.npctype == NPCTYPE_FRIEND))
* *{
* * * *return FALSE;
* *};
* *// если НПС убийца должен быть убить цель
* *if(C_NpcHasAttackReasonToKill(oth))
* *{
* * * *return FALSE;
* *};
* *// если НПС охраняет ворота
* *if(C_NpcIsGateGuard(slf))
* *{
* * * *return FALSE;
* *};
* *return TRUE;
};

... ещё файл

// ************************************************** ******
// Должен ли НПС напасть на незваного гостя
// ************************************************** ******

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_WantToAttackRoomIntruder(var C_NPC slf)
{
* *// Примечание: необходимо во всей функции self заменить на slf.
* *// если НПС Милиционер или Паладин или Наемник или Охотник на драконов или ГГ имеет совершенный криминал
* *if(self.guild == GIL_MIL) ¦¦ (self.guild == GIL_PAL) ¦¦ (self.guild == GIL_SLD) ¦¦ (self.guild == GIL_DJG) ¦¦ (B_GetPlayerCrime(self) != CRIME_NONE)
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// **************************************
// Должен ли НПС атаковать убийцу овец
// **************************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// oth - НПС убийца (обычно ГГ)
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_WantToAttackSheepKiller(var C_NPC slf,var C_NPC oth)
{
* *// если НПС Черный маг или Заключенный или Бандит или Охотник на драконов
* *if(slf.guild == GIL_DMT) ¦¦ (slf.guild == GIL_STRF) ¦¦ (slf.guild == GIL_BDT) ¦¦ (slf.guild == GIL_DJG)
* *{
* * * *return FALSE;
* *};
* *// если НРС игнорирует убийство овец
* *if(slf.aivar[AIV_IGNORE_Sheepkiller] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если убийца ГГ и НПС ему друг
* *if(Npc_IsPlayer(oth) && (slf.npctype == NPCTYPE_FRIEND))
* *{
* * * *return FALSE;
* *};
* *// если убийца должен был убить овцу
* *if(C_NpcHasAttackReasonToKill(oth))
* *{
* * * *return FALSE;
* *};
* *// если убийца человек и у него была причина нападения (Примечание: необходимо other заменить на oth)
* *if(other.guild < GIL_SEPERATOR_HUM) && (other.aivar[AIV_ATTACKREASON] != AR_NONE)
* *{
* * * *return FALSE;
* *};
* *// если НПС охраняет ворота
* *if(C_NpcIsGateGuard(slf))
* *{
* * * *return FALSE;
* *};
* *return TRUE;
};

... ещё файл

// ******************************************
// Должен ли НПС атаковать вора
// ******************************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// oth - НПС вор (обычно ГГ)
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_WantToAttackThief(var C_NPC slf,var C_NPC oth)
{
* *// если НПС Черный ман или Заключенный или Охотник на драконов
* *if(slf.guild == GIL_DMT) ¦¦ (slf.guild == GIL_STRF) ¦¦ (slf.guild == GIL_DJG)
* *{
* * * *return FALSE;
* *};
* *// если НПС не реагирует на воровство
* *if(slf.aivar[AIV_IGNORE_Theft] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если НПС проиграл последнее сражение с ГГ
* *if(slf.aivar[AIV_LastFightAgainstPlayer] == FIGHT_LOST)
* *{
* * * *return FALSE;
* *};
* *// если вор ГГ и НПС ему друг
* *if(Npc_IsPlayer(oth) && (slf.npctype == NPCTYPE_FRIEND))
* *{
* * * *return FALSE;
* *};
* *// если НПС охраняет ворота
* *if(C_NpcIsGateGuard(slf))
* *{
* * * *return FALSE;
* *};
* *return TRUE;
};

... ещё файл

// *********************************
// Должен ли НПС убежать от цели
// *********************************
* *
// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// oth - цель (обычно ГГ)
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_WantToFlee(var C_NPC slf,var C_NPC oth)
{
* *// никогда не убегает!!!
* *return FALSE;
};

... ещё файл

// *********************************
// Должен ли НПС обыскать тело
// *********************************

// =================================
// Аргументы:
// ---------------------------------
// slf - проверяемый НПС
// other - тело (задано неявно)
// ---------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// =================================

func int C_WantToRansack(var C_NPC slf)
{
* *// если НРС друг ГГ и тело есть ГГ
* *if(slf.npctype == NPCTYPE_FRIEND) && (Npc_IsPlayer(other))
* *{
* * * *return FALSE;
* *};
* *// если НПС Равен
* *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Raven))
* *{
* * * *return FALSE;
* *};
* *// если НПС Черный маг или Орк или Паладин или Маг огня или Послушник или Маг воды
* *if(slf.guild == GIL_DMT) ¦¦ (slf.guild == GIL_ORC) ¦¦ (slf.guild == GIL_PAL) ¦¦ (slf.guild == GIL_KDF) ¦¦ (slf.guild == GIL_NOV) ¦¦ (slf.guild == GIL_KDW)
* *{
* * * *return FALSE;
* *};
* *return TRUE;
};

... ещё файл

// **********************************************
// Должен ли НПС реагировать на крадущегося ГГ
// **********************************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый НПС
// oth - крадущийся НПС (обычно ГГ)
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_WantToReactToSneaker(var C_NPC slf,var C_NPC oth)
{
* *// если расстояние между НПС и ГГ > 7м
* *if(Npc_GetDistToNpc(slf,oth) > 700)
* *{
* * * *return FALSE;
* *};
* *// если НПС Черный маг или Заключенный или Бандит и НПС не принадлежит к Лагерю бандитов
* *if(slf.guild == GIL_DMT) ¦¦ (slf.guild == GIL_STRF) ¦¦ ((slf.guild == GIL_BDT) && !C_NpcBelongsToBL(slf))
* *{
* * * *return FALSE;
* *};
* *// если НПС друг ГГ и ГГ крадется
* *if(slf.npctype == NPCTYPE_FRIEND) && (Npc_IsPlayer(oth))
* *{
* * * *return FALSE;
* *};
* *// если отношения между НПС и крадущимся НПС дружеские
* *if(Npc_GetAttitude(slf,oth) == ATT_FRIENDLY)
* *{
* * * *return FALSE;
* *};
* *// если НПС охраняет ворота (Примечание: необходимо self заменить на slf)
* *if(C_NpcIsGateGuard(self))
* *{
* * * *return FALSE;
* *};
* *return TRUE;
};

Ответить с цитированием
Старый 04.04.2005, 22:29   #136
Vam

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

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

2Pa:
Видимо экзешник понимает и self и slf...
Это не так. Надо понимать разницу между локальными и глобальными переменными.
1. В данном случае slf - локальная переменная функции (аргументы функции так же являются локальными переменными), а self - глобальная переменная по всем скриптам.
2. Переменные инициализируются значениями, в нашем случае обе переменные инициализированы НПС (НПС могут быть разные).
3. Если при входе в функцию локальной переменной slf присвоено значение глобальной переменной self, то ошибки не будет, если использовать внутри функции или self или slf. Если же slf присваивается значение отличное от self, то будет ошибка.

Пример: Вызов функции (переменные self и hero не равны)
C_WantToReactToSneaker(self,other) - внутри функции ошибки не будет.
C_WantToReactToSneaker(hero,other) - внутри функции будет ошибка (просто проверится на охраняемость ворот другой НПС, а не тот который передан в функцию через аргумент slf.
Надеюсь, что написал понятно, так что и на такие места надо обращать внимание. *;)
Ответить с цитированием
Старый 06.04.2005, 09:45   #137
Vam

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

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

14. Отношения между гильдиями.

Отношения между гильдиями людей задаются в файле AI\Human\Guilds.d в виде таблицы. Ссылки в скриптах на эту таблицу вы не найдете, она используется только экзешником.
Примечание: Таблицу необходимо смотреть в широкоформатном редакторе.

// размер таблицы
const int TAB_ANZAHL = 16 * 16;

// таблица отношений между гильдиями людей
const int GIL_ATTITUDES[TAB_ANZAHL] = *
{
// ***Гильдии*** * Отсутствует * Паладин * * * Милиционер * *Горожанин * * Маг огня * * *Послушник * * Охотник драк. Наемник * * * Крестьянин * *Бандит * * * *Заключенный *Черный маг * *Чузеземец * * Пират * * * * Маг воды * * *Публичная * * *
/* Отсутствует **/ ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/************************************************** *****************************
************************************************** ******************************
************************************************** ******************************
/* Паладин * * **/ ATT_NEUTRAL, *ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/* Милиционер * */ ATT_NEUTRAL, *ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/* Горожанин * **/ ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/************************************************** *****************************
************************************************** ******************************
************************************************** ******************************
/* Маг огня * * */ ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_FRIENDLY, ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/* Послушник * **/ ATT_NEUTRAL, *ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/************************************************** *****************************
************************************************** ******************************
************************************************** ******************************
/* Охотник драк.*/ ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/* Наемник * * **/ ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/* Крестьянин * */ ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_FRIENDLY, ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/************************************************** *****************************
************************************************** ******************************
************************************************** ******************************
/* Бандит * * * */ ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_FRIENDLY, ATT_NEUTRAL, ATT_NEUTRAL, *ATT_HOSTILE, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/* Заключенный **/ ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/* Черный маг * */ ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_HOSTILE, *ATT_NEUTRAL, *ATT_HOSTILE, ATT_FRIENDLY, ATT_HOSTILE, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, * *
/************************************************** *****************************
************************************************** ******************************
************************************************** ******************************
/* Чужеземец * **/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, * *
/* Пират * * * **/ ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, * *
/* Маг воды * * */ ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_FRIENDLY, ATT_HOSTILE, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, *ATT_FRIENDLY, ATT_NEUTRAL, * *
/* Публичная * **/ ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL, *ATT_NEUTRAL
};


Отношения между гильдиями монстров и гильдиями монстров и людей задаются в файле AI\Monster\B_Monster\B_InitMonsterAttitudes.d
Данный файл я приводить не буду, у него очень большой размер (около 160 Кб).
Все отношения задаются через вызов функции B_InitMonsterAttitudes(), эту функцию мы и рассмотрим: она расположена в этой же директории в одноименном файле.

// ************************************************** ******************
// Устанавливает отношения между гильдиями монстров и всеми остальными
// ************************************************** ******************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// fromGuild - гильдия для которой устанавливается отношение
// attitude - отношение
// toGuild - гильдия с которой устанавливается отношение
// ================================================== ==================

func void B_SetMonsterAttitude(var int fromGuild,var int attitude,var int toGuild)
{
* *// если отношение устанавливается с людьми
* *if(toGuild == GIL_SEPERATOR_HUM)
* *{
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_NONE) ;
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_PAL);
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_MIL);
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_VLK);
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_KDF);
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_NOV);
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_DJG);
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_SLD);
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_BAU);
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_BDT);
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_STRF) ;
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_OUT);
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_PIR);
* * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_KDW);
* *}
* *// если отношение устанавливается для людей
* *else if(fromGuild == GIL_SEPERATOR_HUM)
* *{
* * * *Wld_SetGuildAttitude(GIL_NONE,attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_PAL, attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_MIL, attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_VLK, attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_KDF, attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_NOV, attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_DJG, attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_SLD, attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_BAU, attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_BDT, attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_STRF,attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_OUT, attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_PIR, attitude,toGuild);
* * * *Wld_SetGuildAttitude(GIL_KDW, attitude,toGuild);
* *}
* *else // устанавливается отношение между монстрами
* *{
* * * *Wld_SetGuildAttitude(fromGuild,attitude,toGuild);
* *};
};

Ответить с цитированием
Старый 07.04.2005, 12:02   #138
Vam

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

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

15. Магия.

Общие магические функции расположены в директории AI\Magic

// ************************************************** **
// Регистрация повреждения от магии и начисление экспы
// ************************************************** **

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - НПС кастующий заклинание
// oth - НПС цель
// damage - повреждение, нанесенное заклинанием
// ================================================== ==================

func void B_MagicHurtNpc(var C_NPC slf,var C_NPC oth,var int damage)
{
* *// уменьшить жизнь цели на величину повреждения
* *Npc_ChangeAttribute(oth,ATR_HITPOINTS,-damage);
* *// если цель мертва
* *if(Npc_IsDead(oth))
* *{
* * * *// (если кастующий ГГ или кастующий член партии ГГ) и экспа за цель не была начислена
* * * *if(Npc_IsPlayer(slf) ¦¦ (slf.aivar[AIV_PARTYMEMBER]==TRUE)) && (oth.aivar[AIV_VictoryXPGiven] == FALSE)
* * * *{
* * * * * *// начисление ГГ экспы (уровень цели * 10) (Примечание: Ошибка - вместо self.level должно быть oth.level)
* * * * * *B_GivePlayerXP(self.level * XP_PER_VICTORY);
* * * * * *// установить НПС флаг начисления экспы
* * * * * *oth.aivar[AIV_VictoryXPGiven] = TRUE;
* * * *};
* *};
};

... ещё файл

// **************************************
// Подготовка заклинания к использованию
// **************************************

// ================================================
// Аргументы:
// ------------------------------------------------
// slf - НПС кастующий заклинание
// spell - заклинание
// mana - требуемое кол-во маны
// ================================================

func void B_ReadySpell(var C_NPC slf,var int spell,var int mana)
{
* *// если макс. мана < требуемой
* *if(slf.attribute[ATR_MANA_MAX] < mana)
* *{
* * * *
* * * *// увеличить макс. ману на величину требуемой
* * * *Npc_ChangeAttribute(slf,ATR_MANA_MAX,mana);
* *};
* *// если мана < требуемой
* *if(slf.attribute[ATR_MANA] < mana)
* *{
* * * *// увеличить ману на величину требуемой
* * * *Npc_ChangeAttribute(slf,ATR_MANA,mana);
* *};
* *// если это заклинание уже применяется
* *if(Npc_IsDrawingSpell(slf) == spell)
* *{
* * * *return;
* *} *
* *// если это заклинание уже активно
* *if(Npc_GetActiveSpell(slf) == spell)
* *{
* * * *return; * *
* *}
* *// если активно другое заклинание
* *else if(Npc_GetActiveSpell(slf) != -1)
* *{
* * * *// убрать старое заклинание
* * * *AI_RemoveWeapon(slf);
* *};
* *// взять заклинание в руку
* *AI_ReadySpell(slf,spell,mana);
};

... ещё файл

// ************************************************** ***********
// Выбор заклинания кастующим НПС
// ************************************************** ***********

// ================================================== ===========
// Аргументы:
// -------------------------------------------------------------
// slf - НПС кастующий заклинание (агрессор)
// oth - НПС цель
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - заклинание готово, FALSE - нет.
// ================================================== ===========

func int B_SelectSpell(var C_NPC slf,var C_NPC oth)
{ *
* *// если агрессор друг ГГ и цель ГГ и цель человек
* *if(slf.npctype == NPCTYPE_FRIEND) && Npc_IsPlayer(oth) && (oth.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// если агрессор Маг огня или агрессор всегда использует магию
* * * *if(slf.guild == GIL_KDF) ¦¦ (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS)
* * * *{
* * * * * *// если агрессор не имеет руны Сон
* * * * * *if(Npc_HasItems(slf,ItRu_Sleep) == 0)
* * * * * *{
* * * * * * * *// создать в инвентаре агрессора руну Сон
* * * * * * * *CreateInvItems(slf,ItRu_Sleep,1);
* * * * * *};
* * * * * *// подготовка заклинания Сон
* * * * * *B_ReadySpell(slf,SPL_Sleep,SPL_Cost_Sleep);
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *return FALSE;
* * * *};
* *};
* *// если агрессор Черный маг и агрессор всегда использует магию
* *if(slf.guild == GIL_DMT) && (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS)
* *{
* * * * * *// создать в инвентаре агрессора следующие руны, если он их не имеет
* * * * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0) {CreateInvItems(slf,ItRu_InstantFireball,1);}; *// "Огненный шар"
* * * * * *if(Npc_HasItems(slf,ItRu_Deathbolt) == 0) * * * {CreateInvItems(slf,ItRu_Deathbolt,1);}; * * * *// "Deathbolt" (Примечание: название не переведено)
* * * * * *if(Npc_HasItems(slf,ItRu_Deathball) == 0) * * * {CreateInvItems(slf,ItRu_Deathball,1);}; * * * *// "Deathball"
* * * * * *if(Npc_HasItems(slf,ItRu_Firerain) == 0) * * * *{CreateInvItems(slf,ItRu_Firerain,1);}; * * * * // "Огненный дождь"
* * * * * *if(Npc_HasItems(slf,ItRu_Thunderstorm) == 0) * *{CreateInvItems(slf,ItRu_Thunderstorm,1);}; * * // "Шторм"
* * * * * *if(Npc_HasItems(slf,ItRu_LightningFlash) == 0) *{CreateInvItems(slf,ItRu_LightningFlash,1);}; * // "Удар молнии"
* * * * * *if(Npc_HasItems(slf,ItRu_Firestorm) == 0) * * * {CreateInvItems(slf,ItRu_Firestorm,1);}; * * * *// "Малая огненная буря"
* * * * * *if(Npc_HasItems(slf,ItRu_Skull) == 0) * * * * * {CreateInvItems(slf,ItRu_Skull,1);}; * * * * * *// "Крик мертвых"
* * * *// если агрессор "Черный маг" (Примечание: Маг какой-то особенный, хотя в переводе не отражено)
* * * *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(DMT_1299_OberDementor_DI))
* * * *{
* * * * * *// подготовка заклинания "Крик мертвых"
* * * * * *B_ReadySpell(slf,SPL_Skull,SPL_Cost_Skull);
* * * * * *return TRUE;
* * * *}
* * * *else // обычные Черные маги
* * * *{
* * * * * *// если уже есть оружие готовое к бою
* * * * * *if(Npc_IsDrawingWeapon(slf))
* * * * * *{
* * * * * * * *return TRUE;
* * * * * *};
* * * * * *// если случайное число не задано
* * * * * *if(slf.aivar[AIV_SelectSpell] <= 0)
* * * * * *{
* * * * * * * *var int dK_rnd;
* * * * * * * *dK_rnd = Hlp_Random(10);
* * * * * * * *// получить случайное число
* * * * * * * *slf.aivar[AIV_SelectSpell] += dK_rnd;
* * * * * *};
* * * * * *// если случайное число < 10
* * * * * *if(slf.aivar[AIV_SelectSpell] < 10)
* * * * * *{
* * * * * * * *// если Глава <= 3, то подготовить заклинание "Огненный шар"
* * * * * * * *if(Kapitel <= 3) * * * *{B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_In stantFireball); return TRUE;}
* * * * * * * *// если Глава <= 4, то подготовить заклинание "Deathbolt"
* * * * * * * *else if (Kapitel <= 4) *{B_ReadySpell(slf,SPL_DeathBolt,SPL_Cost_DeathBol t); return TRUE;}
* * * * * * * *// иначе подготовить заклинание "Deathbаll"
* * * * * * * *else /*Kap 5+*/ * * * * {B_ReadySpell(slf,SPL_DeathBall,SPL_Cost_DeathBall ); return TRUE;};
* * * * * *}
* * * * * *// если случайное число == 10
* * * * * *else if(slf.aivar[AIV_SelectSpell] == 10)
* * * * * *{ *
* * * * * * * *// случайное число = 11
* * * * * * * *slf.aivar[AIV_SelectSpell] = 11;
* * * * * * * *var int dK_Mega;
* * * * * * * *dK_Mega = Hlp_Random(100);
* * * * * * * *// с вероятностью 0.02 подготовить заклинание "Огненный дождь"
* * * * * * * *if * * *(dK_Mega <= 2) *{B_ReadySpell(slf,SPL_Firerain,SPL_Cost_Firerain) ; * * * * * * *return TRUE;}
* * * * * * * *// с вероятностью 0.03 подготовить заклинание "Шторм"
* * * * * * * *else if (dK_Mega <= 5) *{B_ReadySpell(slf,SPL_Thunderstorm,SPL_Cost_Thund erstorm); * * *return TRUE;}
* * * * * * * *// с вероятностью 0.05 подготовить заклинание "Удар молнии"
* * * * * * * *else if (dK_Mega <= 10) {B_ReadySpell(slf,SPL_LightningFlash,SPL_Cost_Ligh tningFlash); *return TRUE;}
* * * * * * * *// с вероятностью 0.9 подготовить заклинание "Малая огненная буря"
* * * * * * * *else * * * * * * * * * *{B_ReadySpell(slf,SPL_Firestorm,SPL_Cost_Firestor m); * * * * * *return TRUE;};
* * * * * *}
* * * * * *// если случайное число == 12
* * * * * *else if (slf.aivar[AIV_SelectSpell] == 12)
* * * * * *{ *
* * * * * * * *// случайное число == 0
* * * * * * * *slf.aivar[AIV_SelectSpell] = 0;
* * * * * *};
* * * *};
* * * *return TRUE;
* *};
* *// если агрессор Маг огня или агрессор всегда использует магию
* *if(slf.guild == GIL_KDF) ¦¦ (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS)
* *{
* * * *// создать в инвентаре агрессора следующие руны, если он их не имеет
* * * *if(Npc_HasItems(slf,ItRu_Concussionbolt) == 0)
* * * *{
* * * * * *CreateInvItems(slf,ItRu_Concussionbolt,1); * * *// "Concussionbolt" (Название не переведено)
* * * *};
* * * *if(Npc_HasItems(slf,ItRu_InstantFireBall) == 0)
* * * *{
* * * * * *CreateInvItems(slf,ItRu_InstantFireBall,1); * * // "Огненный шар"
* * * *};
* * * *if(Npc_HasItems(slf,ItRu_Deathball) == 0)
* * * *{
* * * * * *CreateInvItems(slf,ItRu_Deathball,1); * * * * * // "Deathball" (Название не переведено)
* * * *};
* * * *if(Npc_HasItems(slf,ItRu_FullHeal) == 0)
* * * *{
* * * * * *CreateInvItems(slf,ItRu_FullHeal,1); * * * * * *// "Лечить сильное ранение"
* * * *};
* * * *// если текущая жизнь агрессора < 100 (Примечание: здесь и далее необходимо self заменить на slf)
* * * *if(self.attribute[ATR_HITPOINTS] < 100)
* * * *{
* * * * * *// подготовить заклинание "Лечить сильное ранение"
* * * * * *B_ReadySpell(slf,SPL_FullHeal,SPL_Cost_FullHeal);
* * * * * *return TRUE;
* * * *}
* * * *// если причина атаки агрессора убийство цели
* * * *else if(C_NpcHasAttackReasonToKill(self))
* * * *{
* * * * * *// если цель неуязвима или цель Равен (Примечание: Ошибка - необходимо self и other заменить на oth)
* * * * * *if(self.flags == NPC_FLAG_IMMORTAL) ¦¦ (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(Raven))
* * * * * *{
* * * * * * * *// подготовить заклинание "Deathball"
* * * * * * * *B_ReadySpell(slf,SPL_Deathball,SPL_Cost_Deathball );
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *// подготовить заклинание "Огненный шар"
* * * * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireBall);
* * * * * *};
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *// подготовить заклинание "Concussionbolt"
* * * * * *B_ReadySpell(slf,SPL_Concussionbolt,SPL_Cost_Conc ussionbolt);
* * * * * *return TRUE;
* * * *};
* *};
* *// если агрессор Паладин
* *if(slf.guild == GIL_PAL)
* *{
* * * *// если агрессор применяет тактику сражения охраны крепостных стен
* * * *if(slf.fight_tactic == FAI_NAILED)
* * * *{
* * * * * *return FALSE;
* * * *};
* * * *// если агрессор не имеет руны "Святая стрела"
* * * *if(Npc_HasItems(slf,ItRu_PalHolyBolt) == 0)
* * * *{
* * * * * *// создать в инвентаре агрессора руну "Святая стрела"
* * * * * *CreateInvItems(slf,ItRu_PalHolyBolt,1);
* * * *};
* * * *// если расстояние между агрессором и целью > дистанции атаки оружием ближнего радиуса действия и цель является источником зла
* * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE) && (C_NpcIsEvil(oth))
* * * *{
* * * * * *// подготовить заклинание "Святая стрела"
* * * * * *B_ReadySpell(slf,SPL_PalHolyBolt,SPL_Cost_PalHoly Bolt);
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *return FALSE;
* * * *};
* *};
* *// если агрессор Маг скелетов
* *if(slf.guild == GIL_SKELETON_MAGE)
* *{
* * * *// создать в инвентаре агрессора следующие руны, если он их не имеет
* * * *if(Npc_HasItems(slf,ItRu_SumSkel) == 0)
* * * *{
* * * * * *CreateInvItems(slf,ItRu_SumSkel,1); * * // "Вызвать скелет"
* * * *};
* * * *if(Npc_HasItems(slf,ItRu_IceCube) == 0)
* * * *{
* * * * * *CreateInvItems(slf,ItRu_IceCube,1); * * // "Ледяная глыба"
* * * *};
* * * *if(Npc_HasItems(slf,ItRu_Icebolt) == 0)
* * * *{
* * * * * *CreateInvItems(slf,ItRu_Icebolt,1); * * // "Ледяная стрела"
* * * *};
* * * *// если случайное число >= 6
* * * *if(slf.aivar[AIV_SelectSpell] >= 6)
* * * *{
* * * * * *// случайное число = 1
* * * * * *slf.aivar[AIV_SelectSpell] = 1;
* * * *};
* * * *// если цель не заморожена и случайное число == 0
* * * *if(!Npc_IsInState(oth,ZS_MagicFreeze)) && (slf.aivar[AIV_SelectSpell] == 0)
* * * *{
* * * * * *// подготовить заклинание "Ледяная глыба"
* * * * * *B_ReadySpell(slf,SPL_IceCube,SPL_Cost_IceCube);
* * * * * *return TRUE;
* * * *}
* * * *// если случайное число == 1
* * * *else if (slf.aivar[AIV_SelectSpell] == 1)
* * * *{
* * * * * *// подготовить заклинание "Вызвать скелет"
* * * * * *B_ReadySpell(slf,SPL_SummonSkeleton,SPL_Cost_Summ onSkeleton);
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *// подготовить заклинание "Ледяная стрела"
* * * * * *B_ReadySpell(slf,SPL_Icebolt,SPL_Cost_Icebolt);
* * * * * *return TRUE;
* * * *};
* *};
* *// если агрессор Ледяной голем
* *if(slf.guild == GIL_ICEGOLEM)
* *{
* * * *// если агрессор не имеет руны "Ледяная глыба"
* * * *if(Npc_HasItems(slf,ItRu_IceCube) == 0)
* * * *{
* * * * * *// создать в инвентаре агрессора руну "Ледяная глыба"
* * * * * *CreateInvItems(slf,ItRu_IceCube,1);
* * * *};
* * * *// если расстояние между агрессором и целью < дистанции атаки оружием ближнего радиуса действия или цель заморожена
* * * *if(Npc_GetDistToNpc(slf,oth) < FIGHT_DIST_MELEE) ¦¦ Npc_IsInState(oth,ZS_MagicFreeze) * * * * * * * * * * * * * * *
* * * *{
* * * * * *return FALSE;
* * * *}
* * * *else
* * * *{
* * * * * *// подготовить заклинание "Ледяная глыба"
* * * * * *B_ReadySpell(slf,SPL_IceCube,SPL_Cost_IceCube);
* * * * * *return TRUE;
* * * * * *
* * * *};
* *};
* *// если агрессор Огненный голем
* *if(slf.guild == GIL_FIREGOLEM)
* *{
* * * *// если агрессор не имеет руны "Огненный шар"
* * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
* * * *{
* * * * * *// создать в инвентаре агрессора руну "Огненный шар"
* * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);
* * * *};
* * * *// если расстояние между агрессором и целью > дистанции атаки оружием ближнего радиуса действия
* * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE)
* * * *{
* * * * * *// подготовить заклинание "Огненный шар"
* * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *return FALSE;
* * * *};
* *};
* *// если агрессор Болотный дракон
* *if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_SWAMP)
* *{
* * * *// если агрессор не имеет руны "Огненный шар"
* * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
* * * *{
* * * * * *// создать в инвентаре агрессора руну "Огненный шар"
* * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);
* * * *};
* * * *// если расстояние между агрессором и целью > дистанции применения драконами магии
* * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)
* * * *{
* * * * * *// подготовить заклинание "Огненный шар"
* * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *return FALSE;
* * * *};
* *};
* *// если агрессор Каменный дракон (всё идентично Болотному дракону)
* *if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ROCK)
* *{
* * * *if (Npc_HasItems(slf,ItRu_InstantFireball) == 0)
* * * *{
* * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);
* * * *};
* * * *if (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)
* * * *{
* * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *return FALSE;
* * * *};
* *};
* *// если агрессор Огненный дракон (всё идентично Болотному дракону)
* *if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE)
* *{
* * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
* * * *{
* * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);
* * * *};
* * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)
* * * *{
* * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *return FALSE;
* * * *};
* *};
* *// если агрессор Ледяной дракон (всё идентично Болотному дракону)
* *if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE)
* *{
* * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
* * * *{
* * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);
* * * *};
* * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)
* * * *{
* * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *return FALSE;
* * * *};
* *};
* *// если агрессор Дракон нежить
* *if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_UNDEAD)
* *{
* * * *// очистить очередь AI состояний агрессора (Примечание: заменить self на slf)
* * * *Npc_ClearAIQueue(self);
* * * *// если агрессор не имеет руны "Deathball"
* * * *if(Npc_HasItems(slf,ItRu_Deathball) == 0)
* * * *{
* * * * * *// создать в инвентаре агрессора руну "Deathball"
* * * * * *CreateInvItems(slf,ItRu_Deathball,1);
* * * *};
* * * *// если расстояние между агрессором и целью > дистанции применения драконами магии
* * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)
* * * *{
* * * * * *// подготовить заклинание "Deathball"
* * * * * *B_ReadySpell(slf,SPL_Deathball,SPL_Cost_Deathball );
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *return FALSE;
* * * *};
* *};
* *// если агрессор Шаман орков (всё идентично Огненному голему)
* *if(slf.aivar[AIV_MM_REAL_ID] == ID_ORCSHAMAN)
* *{
* * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
* * * *{
* * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);
* * * *};
* * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE)
* * * *{
* * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *return FALSE;
* * * *};
* *};
* *return FALSE;
}; *

Ответить с цитированием
Старый 08.04.2005, 12:36   #139
Vam

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

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

// ************************************************** ****************
// Действия, оказываемые заклинаниями, на НПС
// ------------------------------------------------------------------
// Данная функция вызывается только экзешником в состоянии НПС реакции на магию
// self - НПС, против которого применено заклинание
// other - НПС, применивший заклинание
// ************************************************** ****************

const int COLL_DONOTHING * * * * * *= 0; * * * *// воздействие не оказывается
const int COLL_DOEVERYTHING * * * * = 1<<0; * * // полное воздействие
const int COLL_APPLYDAMAGE * * * * *= 1<<1; * * // только физический урон
const int COLL_APPLYHALVEDAMAGE * * = 1<<2; * * // половинный урон
const int COLL_APPLYDOUBLEDAMAGE * *= 1<<3; * * // удвоенный урон
const int COLL_APPLYVICTIMSTATE * * = 1<<4; * * // в зависимости от состояния жертвы
const int COLL_DONTKILL * * * * * * = 1<<5; * * // не убивает


// ================================================== ===========
// Аргументы:
// -------------------------------------------------------------
// spellType - тип заклинания
// --------------------------------------------------------------------
// Возвращаемое значение:
// Тип оказываемого воздействия на НПС.
// ================================================== ===========

func int C_CanNpcCollideWithSpell(var int spellType)
{
* *// если заклинание "Смерч"
* *if(spellType == SPL_Whirlwind)
* *{
* * * *// если НПС обездвижен или
* * * *if (C_NpcIsDown(self))
* * * *¦¦ (C_BodyStateContains(self,BS_SWIM)) *// плывет
* * * *¦¦ (C_BodyStateContains(self,BS_DIVE)) *// или ныряет
* * * *¦¦ (self.guild == GIL_STONEGOLEM) * * * // или Каменный голем
* * * *¦¦ (self.guild == GIL_ICEGOLEM) * * * * // или Ледяной голем
* * * *¦¦ (self.guild == GIL_FIREGOLEM) * * * *// или Каменный голем
* * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // или Вызванный голем
* * * *¦¦ (self.guild == GIL_DEMON) * * * * * *// или Демон
* * * *¦¦ (self.guild == GIL_SUMMONED_DEMON) * // или Вызванный демон
* * * *¦¦ (self.guild == GIL_TROLL) * * * * * *// или Троль
* * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // повтор (убрать!)
* * * *¦¦ (self.guild == GIL_DRAGON) * * * * * // или Дракон
* * * *¦¦ (self.guild == GIL_STONEGUARDIAN) * *// или Каменный страж
* * * *¦¦ (self.flags == NPC_FLAG_IMMORTAL) * *// или неубиваем
* * * *¦¦ (self.guild == GIL_SHADOWBEAST) * * *// или Мракорис
* * * *¦¦ (self.guild == GIL_GARGOYLE) * * * * // или Огненный дух мракориса
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *// если НПС охраняет ворота
* * * *if(C_NpcIsGateGuard(self) == TRUE)
* * * *{
* * * * * *return COLL_APPLYDAMAGE;
* * * *};
* * * *return COLL_DOEVERYTHING;
* *};
* *// если заклинание "Ледяное копье"
* *if(spellType == SPL_Icelance)
* *{
* * * *// если НПС обездвижен или плывет или ныряет
* * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *// если НПС Ледяной голем или Ледяной волк или Ледяной дракон
* * * *if(self.guild == GIL_ICEGOLEM) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_Icewolf) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE) * * *
* * * *{
* * * * * *return COLL_APPLYHALVEDAMAGE;
* * * *};
* * * *// если НПС Огненный голем или
* * * *if (self.guild == GIL_FIREGOLEM)
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN) * * // Огненная ящерица
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE) * // или Огненный дракон
* * * *¦¦ (self.guild == GIL_GARGOYLE) * * * * * * * * * * // или Огненный дух мракориса
* * * *{
* * * * * *return COLL_APPLYDOUBLEDAMAGE;
* * * *};
* * * *return COLL_APPLYDAMAGE;
* *};
* *// если заклинание "Шторм"
* *if (spellType == SPL_Thunderstorm)
* *{
* * * *// если НПС обездвижен или плывет или ныряет
* * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *// если НПС Ледяной голем или Ледяной волк или Ледяной дракон
* * * *if(self.guild == GIL_ICEGOLEM) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_Icewolf) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE) * * *
* * * *{
* * * * * *return COLL_APPLYHALVEDAMAGE;
* * * *};
* * * *// если НПС Огненный голем или
* * * *if (self.guild == GIL_FIREGOLEM)
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN) * * // Огненная ящерица
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE) * // или Огненный дракон
* * * *¦¦ (self.guild == GIL_GARGOYLE) * * * * * * * * * * // или Огненный дух мракориса
* * * *{
* * * * * *return COLL_APPLYDOUBLEDAMAGE;
* * * *};
* * * *return COLL_DOEVERYTHING;
* *};
* *// если заклинание "Гейзер"
* *if(spellType == SPL_Geyser)
* *{
* * * *// если НПС обездвижен
* * * *if (C_NpcIsDown(self))
* * * *¦¦ (C_BodyStateContains(self,BS_SWIM)) *// или плывет
* * * *¦¦ (C_BodyStateContains(self,BS_DIVE)) *// или ныряет
* * * *¦¦ (self.guild == GIL_STONEGOLEM) * * * // или Каменный голем
* * * *¦¦ (self.guild == GIL_ICEGOLEM) * * * * // или Ледяной голем
* * * *¦¦ (self.guild == GIL_FIREGOLEM) * * * *// или Огненный голем
* * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // или Вызванный голем
* * * *¦¦ (self.guild == GIL_DEMON) * * * * * *// или Демон
* * * *¦¦ (self.guild == GIL_SUMMONED_DEMON) * // или Вызванный демон
* * * *¦¦ (self.guild == GIL_TROLL) * * * * * *// или Троль
* * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // повтор (убрать!)
* * * *¦¦ (self.guild == GIL_DRAGON) * * * * * // или Дракон
* * * *¦¦ (self.guild == GIL_STONEGUARDIAN) * *// или Каменный страж
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *return COLL_APPLYDAMAGE ¦ COLL_DONTKILL;
* *};
* *// если заклинание "Кулак воды"
* *if(spellType == SPL_Waterfist)
* *{
* * * *// если НПС обездвижен или плывет или ныряет
* * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *// если НПС Дракон или Троль
* * * *if(self.guild == GIL_DRAGON) ¦¦ (self.guild == GIL_TROLL)
* * * *{
* * * * * *return COLL_APPLYHALVEDAMAGE;
* * * *};
* * * *// если НПС Огненный голем или Огненная ящерица или Огненный дух мракориса
* * * *if(self.guild == GIL_FIREGOLEM) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN) ¦¦ (self.guild == GIL_GARGOYLE)
* * * *{
* * * * * *return COLL_APPLYDOUBLEDAMAGE;
* * * *};
* * * *return COLL_APPLYDAMAGE ¦ COLL_DONTKILL;
* *};
* *// если заклинание "Шар энергии"
* *if(spellType == SPL_EnergyBall)
* *{
* * * *// если НПС обездвижен или плывет или ныряет
* * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *// если НПС нежить
* * * *if(C_NpcIsUndead(self))
* * * *{
* * * * * *return COLL_APPLYHALVEDAMAGE;
* * * *};
* * * *return COLL_DOEVERYTHING;
* *};
* *// если заклинание "Украсть энергию"
* *if(spellType == SPL_SuckEnergy)
* *{
* * * *// если НПС обездвижен или
* * * *if (C_NpcIsDown(self))
* * * *¦¦ (C_BodyStateContains(self,BS_SWIM)) * * *// плывет
* * * *¦¦ (C_BodyStateContains(self,BS_DIVE)) * * *// или ныряет
* * * *¦¦ (self.guild > GIL_SEPERATOR_HUM) * * * * // или монстр
* * * *¦¦ (self.flags == NPC_FLAG_IMMORTAL) * * * *// или неубиваем
* * * *¦¦ (Npc_GetDistToNpc(self,other) > 1000) * *// или расстояние между НПС > 10м
* * * *¦¦ (self.guild == GIL_DMT) * * * * * * * * *// или Черный маг
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *return COLL_DOEVERYTHING;
* *};
* *// если заклинание "Зеленые щупальца"
* *if(spellType == SPL_GreenTentacle)
* *{
* * * *// если НПС обездвижен или
* * * *if (C_NpcIsDown(self))
* * * *¦¦ (C_BodyStateContains(self,BS_SWIM)) * * * * * * * * *// плывет
* * * *¦¦ (C_BodyStateContains(self,BS_DIVE)) * * * * * * * * *// или ныряет
* * * *¦¦ (C_NpcIsGateGuard(self)== TRUE) * * * * * * * * * * *// или охраняет ворота
* * * *¦¦ (self.guild == GIL_BLOODFLY) * * * * * * * * * * * * // или Кровяной шершень
* * * *¦¦ (self.guild == GIL_DEMON) * * * * * * * * * * * * * *// или Демон
* * * *¦¦ (self.guild == GIL_TROLL) * * * * * * * * * * * * * *// или Троль
* * * *¦¦ (self.guild == GIL_DRAGON) * * * * * * * * * * * * * // или Дракон
* * * *¦¦ (self.guild == GIL_HARPY) * * * * * * * * * * * * * *// или Гарпия
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_SKELETON_MAGE) * * // или Маг скелетов
* * * *¦¦ (self.guild == GIL_Gargoyle) * * * * * * * * * * * * // или Огненный дух мракориса
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *return COLL_DOEVERYTHING;
* *};
* *// если заклинание "Рой"
* *if(spellType == SPL_Swarm)
* *{
* * * *// если НПС обездвижен или
* * * *if (C_NpcIsDown(self))
* * * *¦¦ (C_BodyStateContains(self,BS_SWIM)) *// плывет
* * * *¦¦ (C_BodyStateContains(self,BS_DIVE)) *// или ныряет
* * * *¦¦ (self.guild == GIL_STONEGOLEM) * * * // или Каменный голем
* * * *¦¦ (self.guild == GIL_ICEGOLEM) * * * * // или Ледяной голем
* * * *¦¦ (self.guild == GIL_FIREGOLEM) * * * *// или Огненный голем
* * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // или Вызванный голем
* * * *¦¦ (self.guild == GIL_DEMON) * * * * * *// или Демон
* * * *¦¦ (self.guild == GIL_SUMMONED_DEMON) * // или Вызванный демон
* * * *¦¦ (self.guild == GIL_TROLL) * * * * * *// или Троль
* * * *¦¦ (self.guild == GIL_BLOODFLY) * * * * // или Кровяной шершень
* * * *¦¦ (self.guild == GIL_DRAGON) * * * * * // или Дракон
* * * *¦¦ (self.guild == GIL_Gargoyle) * * * * // или Огненный дух мракориса
* * * *¦¦ (self.guild == GIL_DMT) * * * * * * *// или Черный маг
* * * *¦¦ (self.guild == GIL_STONEGUARDIAN) * *// или Каменный страж
* * * *¦¦ (C_NPCIsUndead(self) == TRUE) * * * *// или нежить
* * * *{
* * * * * *return COLL_DONOTHING; *
* * * *};
* * * *// если НПС монстр или охраняет ворота
* * * *if(self.guild > GIL_SEPERATOR_HUM) ¦¦ (C_NpcIsGateGuard(self) == TRUE)
* * * *{
* * * * * *return COLL_APPLYDAMAGE;
* * * *};
* * * *return COLL_DOEVERYTHING;
* *};
* *// если заклинание "Крик мертвых"
* *if(spellType == SPL_Skull)
* *{
* * * *// если НПС обездвижен или плывет или ныряет или нежить
* * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE)) ¦¦ (C_NpcIsUndead(self))
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *return COLL_DOEVERYTHING;
* *};
* *// если заклинание "Порыв ветра"
* *if(spellType == SPL_WINDFIST)
* *{
* * * *// если расстояние между НПС > 10м
* * * *if(Npc_GetDistToNpc(other,self) >= 1000)
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *return COLL_DOEVERYTHING;
* *};
* *// если заклинание "Молния" или "Шаровая молния" или "Стрела сотрясения"
* *if(spellType == SPL_Zap) ¦¦ (spellType == SPL_ChargeZap) ¦¦ (spellType == SPL_Concussionbolt)
* *{
* * * *// если НПС обездвижен
* * * *if(C_NpcIsDown(self))
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *return COLL_APPLYDAMAGE ¦ COLL_DONTKILL;
* *};
* *// если нападающий Черный маг
* *if(other.guild == GIL_DMT)
* *{
* * * *// если заклинание "Огненный дождь" или "Шторм" или "Удар молнии"
* * * *if(spellType == SPL_Firerain) ¦¦ (spellType == SPL_Thunderstorm) ¦¦ (spellType == SPL_LightningFlash)
* * * *{
* * * * * *// если НПС Черный маг
* * * * * *if(self.guild == GIL_DMT)
* * * * * *{
* * * * * * * *return COLL_DONOTHING;
* * * * * *}
* * * * * *// если НПС ГГ
* * * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(hero))
* * * * * *{
* * * * * * * *return COLL_APPLYHALVEDAMAGE;
* * * * * *};
* * * *};
* * * *// если заклинание Большая огненная буря и НПС Черный маг
* * * *if(spellType == SPL_Firestorm) && (self.guild == GIL_DMT)
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* *};
* *// если заклинание Большой огненный шар или
* *if (spellType == SPL_ChargeFireball)
* *¦¦ (spellType == SPL_InstantFireball) * // или Огненный шар
* *¦¦ (spellType == SPL_Firerain) * * * * *// или Огненный дождь
* *¦¦ (spellType == SPL_Firebolt) * * * * *// или Огненная стрела
* *¦¦ (spellType == SPL_Firestorm) * * * * // или Большая огненная буря
* *¦¦ (spellType == SPL_Pyrokinesis) * * * // или Малая огненная буря
* *¦¦ (spellType == SPL_Deathbolt) * * * * // или Стрела смерти
* *¦¦ (spellType == SPL_Deathball) * * * * // или Шар смерти
* *{
* * * *// если НПС обездвижен или плывет или ныряет
* * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *// если НПС Огненный голем или
* * * *if (self.guild == GIL_FIREGOLEM) * * * *
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN) * * // Огненная ящерица
* * * *¦¦ (self.guild == GIL_GARGOYLE) * * * * * * * * * * // или Огненный дух мракориса
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE) * // или Огненный дракон
* * * *{
* * * * * *return COLL_APPLYHALVEDAMAGE;
* * * *}
* * * *// если НПС Ледяной голем или
* * * *if (self.guild == GIL_ICEGOLEM)
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE) * *// Ледяной дракон
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_ICEWOLF) * * * // или Ледяной волк
* * * *{
* * * * * *return COLL_APPLYDOUBLEDAMAGE;
* * * *};
* * * *// если НПС Каменный голем или
* * * *if (self.guild == GIL_STONEGOLEM)
* * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // Вызванный голем
* * * *¦¦ (self.guild == GIL_DEMON) * * * * * *// или Демон
* * * *¦¦ (self.guild == GIL_SUMMONED_DEMON) * // или Вызванный демон
* * * *¦¦ (self.guild == GIL_TROLL) * * * * * *// или Троль
* * * *¦¦ (self.guild == GIL_DRAGON) * * * * * // или Дракон
* * * *{ *
* * * * * *return COLL_APPLYDAMAGE;
* * * *};
* * * *return COLL_DOEVERYTHING;
* *};
* *// если заклинание Ледяная глыба или Ледяная волна или Ледяная стрела
* *if(spellType *== SPL_IceCube) ¦¦ (spellTYpe *== SPL_IceWave) ¦¦ (spelltype *== SPL_Icebolt)
* *{
* * * *// если НПС обездвижен или плывет или ныряет
* * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *// если НПС Огненный голем или
* * * *if (self.guild == GIL_FIREGOLEM)
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN) * * // Огненная ящерица
* * * *¦¦ (self.guild == GIL_GARGOYLE) * * * * * * * * * * // или Огненный дух мракориса
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE) * // или Огненный дракон
* * * *{
* * * * * *return COLL_APPLYDOUBLEDAMAGE;
* * * *};
* * * *// если НПС Ледяной голем или
* * * *if (self.guild == GIL_ICEGOLEM)
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE) * *// Ледяной дракон
* * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_ICEWOLF) * * * // или Ледяной волк
* * * *{
* * * * * *return COLL_APPLYHALVEDAMAGE;
* * * *};
* * * *// если НПС Каменный голем или
* * * *if (self.guild == GIL_STONEGOLEM)
* * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // Вызванный голем
* * * *¦¦ (self.guild == GIL_DEMON) * * * * * *// или Демон
* * * *¦¦ (self.guild == GIL_SUMMONED_DEMON) * // или Вызванный демон
* * * *¦¦ (self.guild == GIL_TROLL) * * * * * *// или Троль
* * * *¦¦ (self.guild == GIL_DRAGON) * * * * * // или Дракон
* * * *{
* * * * * *return COLL_APPLYDAMAGE;
* * * *};
* * * *return COLL_DOEVERYTHING;
* *};
* *// если заклинание Удар молнии
* *if (spellType == SPL_LightningFlash)
* *{
* * * *// если НПС обездвижен
* * * *if(C_NpcIsDown(self))
* * * *{
* * * * * *return COLL_DONOTHING; *
* * * *};
* * * *// если НПС плывет или ныряет
* * * *if(C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))
* * * *{
* * * * * *COLL_APPLYDOUBLEDAMAGE;
* * * *};
* * * *return COLL_DOEVERYTHING; *
* *};
* *// если заклинание Страх
* *if(spellType == SPL_Fear)
* *{
* * * *// если НПС не Огненный голем и
* * * *if (self.guild != GIL_FIREGOLEM)
* * * *&& (self.guild != GIL_ICEGOLEM) * * * * // не Ледяной голем
* * * *&& (self.guild != GIL_STONEGOLEM) * * * // и не Каменный голем
* * * *&& (self.guild != GIL_SUMMONED_GOLEM) * // и не Вызванный голем
* * * *&& (self.guild != GIL_SWAMPSHARK) * * * // и не Болотный голем
* * * *&& (self.guild != GIL_TROLL) * * * * * *// и не Троль
* * * *&& (!C_NpcIsEvil(self)) * * * * * * * * // и не источник зла
* * * *&& (C_NpcIsGateGuard(self) == FALSE) * *// и не охранник ворот
* * * *{
* * * * * *return COLL_DOEVERYTHING;
* * * *};
* * * *return COLL_DONOTHING;
* *};
* *// если заклинание Уничтожить нежить
* *if(spellType == SPL_DestroyUndead)
* *{
* * * *// если НПС нежить и жизнь НПС <= урону заклинания
* * * *if(C_NpcIsUndead(self)) && (self.attribute[ATR_HITPOINTS_MAX] <= SPL_Damage_DESTROYUNDEAD)
* * * *{ *
* * * * * *return COLL_DOEVERYTHING;
* * * *};
* * * *return COLL_DONOTHING;
* *};
* *// если заклинание Дым смерти
* *if(spellType == SPL_BreathOfDeath)
* *{
* * * *// если расстояние между НПС < 10м и НПС не нежить
* * * *if(Npc_GetDistToNpc(other,self) < 1000) && (!C_NpcIsUndead(self))
* * * *{
* * * * * *// если НПС дракон или НПС не ГГ
* * * * * *if(self.guild == GIL_DRAGON) ¦¦ (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(hero)) * *
* * * * * *{
* * * * * * * *return COLL_APPLYHALVEDAMAGE;
* * * * * *};
* * * * * *return COLL_DOEVERYTHING;
* * * *};
* * * *return COLL_DONOTHING;
* *};
* *// если заклинание Волна смерти
* *if(spellType == SPL_MassDeath)
* *{
* * * *// если НПС не нежить
* * * *if(!C_NpcIsUndead(self)) * *
* * * *{
* * * * * *// если НПС дракон
* * * * * *if(self.guild == GIL_DRAGON)
* * * * * *{
* * * * * * * *return COLL_APPLYHALVEDAMAGE;
* * * * * *};
* * * * * *return COLL_DOEVERYTHING;
* * * *};
* * * *return COLL_DONOTHING;
* *};
* *// если заклинание Святой удар
* *if(spellType == SPL_MasterOfDisaster)
* *{
* * * *// если НПС не обездвижен и не плывет и не ныряет и нежить
* * * *if(!C_NpcIsDown(self)) && (!C_BodyStateContains(self,BS_SWIM)) && (!C_BodyStateContains(self,BS_DIVE)) && (C_NpcIsEvil(self))
* * * *{
* * * * * *return COLL_DOEVERYTHING;
* * * *};
* * * *return COLL_DONOTHING;
* *};
* *// если заклинание Уменьшить монстра
* *if(spellType == SPL_Shrink)
* *{
* * * *// если НПС обездвижен или плывет или ныряет или дракон
* * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE)) ¦¦ (self.guild == GIL_DRAGON)
* * * *{
* * * * * *return COLL_DONOTHING;
* * * *};
* * * *return COLL_DOEVERYTHING;
* *};
* *// если заклинание Святая стрела
* *if(spellType == SPL_PalHolyBolt)
* *{
* * * *// если НПС источник зла
* * * *if(C_NpcIsEvil(self))
* * * *{
* * * * * *return COLL_DOEVERYTHING;
* * * *};
* * * *return COLL_DONOTHING;
* *}
* *// если заклинание Разогнать дьяволов
* *else if(spellType == SPL_PalRepelEvil)
* *{
* * * *// если НПС источник зла
* * * *if(C_NpcIsEvil(self))
* * * *{
* * * * * *// если жизнь НПС <= ущербу заклинания
* * * * * *if(self.attribute[ATR_HITPOINTS_MAX] <= SPL_Damage_PalRepelEvil)
* * * * * *{
* * * * * * * *return COLL_DOEVERYTHING;
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *return COLL_APPLYHALVEDAMAGE;
* * * * * *};
* * * *};
* * * *return COLL_DONOTHING;
* *}
* *// если заклинание Уничтожить дьяволов
* *else if(spellType == SPL_PalDestroyEvil)
* *{
* * * *// если НПС источник зла и жизнь НПС <= ущербу заклинания
* * * *if(C_NpcIsEvil(self)) && (self.attribute[ATR_HITPOINTS_MAX] <= SPL_Damage_PalDestroyEvil)
* * * *{
* * * * * *return COLL_DOEVERYTHING;
* * * *};
* * * *return COLL_DONOTHING;
* *};
* *return COLL_DOEVERYTHING;
};

Ответить с цитированием
Старый 09.04.2005, 12:49   #140
Vam

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

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

//************************************************** ************
****************
// Управление процессом инвестирования маны для всех заклинаний
//------------------------------------------------------------------------------
// Данная функция вызывается только экзешником
// self - кастующий НПС (агрессор)
// other - НПС цель
//************************************************** ****************************
//================================================== ===========
// Аргументы:
//-------------------------------------------------------------
// manaInvested - кол-во инвестируемой маны
// -------------------------------------------------------------
// Возвращаемое значение:
// Одна из констант, управляющая процессом инвестирования маны.
// ================================================== ===========

func int Spell_ProcessMana(var int manaInvested)
{
* *var int activeSpell;
* *// получить активное заклинание агрессора
* *activeSpell = Npc_GetActiveSpell(self);
* *// В зависимости от заклинания вызывается соответствующая функция, управляющая инвестированием маны
* *if(activeSpell == SPL_PalLight * * * * *) * { * return *Spell_Logic_PalLight * * * *(manaInvested); };
* *if(activeSpell == SPL_PalLightHeal * * *) * { * return *Spell_Logic_PalLightHeal * *(manaInvested); };
* *if(activeSpell == SPL_PalHolyBolt * * * ) * { * return *Spell_Logic_PalHolyBolt * * (manaInvested); };
* *if(activeSpell == SPL_PalMediumHeal * * ) * { * return *Spell_Logic_PalMediumHeal * (manaInvested); };
* *if(activeSpell == SPL_PalRepelEvil * * *) * { * return *Spell_Logic_PalRepelEvil * *(manaInvested); };
* *if(activeSpell == SPL_PalFullHeal * * * ) * { * return *Spell_Logic_PalFullHeal * * (manaInvested); };
* *if(activeSpell == SPL_PalDestroyEvil * *) * { * return *Spell_Logic_PalDestroyEvil *(manaInvested); };
* *if(activeSpell == SPL_PalTeleportSecret ) * { * return *Spell_Logic_PalTeleportSecret(manaInvested); };
* *if(activeSpell == SPL_TeleportSeaport * ) * { * return *Spell_Logic_TeleportSeaport (manaInvested); };
* *if(activeSpell == SPL_TeleportMonastery ) * { * return *Spell_Logic_TeleportMonastery(manaInvested); };
* *if(activeSpell == SPL_TeleportFarm * * *) * { * return *Spell_Logic_TeleportFarm * *(manaInvested); };
* *if(activeSpell == SPL_TeleportXardas * *) * { * return *Spell_Logic_TeleportXardas *(manaInvested); };
* *if(activeSpell == SPL_TeleportPassNW * *) * { * return *Spell_Logic_TeleportPassNW *(manaInvested); };
* *if(activeSpell == SPL_TeleportPassOW * *) * { * return *Spell_Logic_TeleportPassOW *(manaInvested); };
* *if(activeSpell == SPL_TeleportOC * * * *) * { * return *Spell_Logic_TeleportOC * * *(manaInvested); };
* *if(activeSpell == SPL_TeleportOWDemonTower) { * return *Spell_Logic_TeleportOWDemonTower(manaInvested); };
* *if(activeSpell == SPL_TeleportTaverne * ) * { * return *Spell_Logic_TeleportTaverne (manaInvested); };
* *if(activeSpell == SPL_LIGHT * * * * * * ) * { * return *Spell_Logic_Light * * * * * (manaInvested); };
* *if(activeSpell == SPL_Firebolt * * * * *) * { * return *Spell_Logic_Firebolt * * * *(manaInvested); };
* *if(activeSpell == SPL_Icebolt * * * * * ) * { * return *Spell_Logic_Icebolt * * * * (manaInvested); };
* *if(activeSpell == SPL_Zap * * * * * * * ) * { * return *Spell_Logic_Zap * * * * * * (manaInvested); };
* *if(activeSpell == SPL_LightHeal * * * * ) * { * return *Spell_Logic_LightHeal * * * (manaInvested); };
* *if(activeSpell == SPL_SummonGoblinSkeleton) { * return *Spell_Logic_SummonGoblinSkeleton(manaInvested); };
* *if(activeSpell == SPL_InstantFireball * ) * { * return *Spell_Logic_InstantFireball (manaInvested); };
* *if(activeSpell == SPL_SummonWolf * * * *) * { * return *Spell_Logic_SummonWolf * * *(manaInvested); };
* *if(activeSpell == SPL_WINDFIST * * * * *) * { * return *Spell_Logic_Windfist * * * *(manaInvested); };
* *if(activeSpell == SPL_Sleep * * * * * * ) * { * return *Spell_Logic_Sleep * * * * * (manaInvested); };
* *if(activeSpell == SPL_MediumHeal * * * *) * { * return *Spell_Logic_MediumHeal * * *(manaInvested); };
* *if(activeSpell == SPL_LightningFlash * *) * { * return *Spell_Logic_LightningFlash *(manaInvested); };
* *if(activeSpell == SPL_ChargeFireball * *) * { * return *Spell_Logic_ChargeFireball *(manaInvested); };
* *if(activeSpell == SPL_ChargeZap * * * * ) * { * return *Spell_Logic_ChargeZap * * * (manaInvested); };
* *if(activeSpell == SPL_SummonSkeleton * *) * { * return *Spell_Logic_SummonSkeleton *(manaInvested); };
* *if(activeSpell == SPL_Fear * * * * * * *) * { * return *Spell_Logic_Fear * * * * * *(manaInvested); };
* *if(activeSpell == SPL_IceCube * * * * * ) * { * return *Spell_Logic_IceCube * * * * (manaInvested); };
* *if(activeSpell == SPL_ChargeZap * * * * ) * { * return *Spell_Logic_ChargeZap * * * (manaInvested); };
* *if(activeSpell == SPL_SummonGolem * * * ) * { * return *Spell_Logic_SummonGolem * * (manaInvested); };
* *if(activeSpell == SPL_DestroyUndead * * ) * { * return *Spell_Logic_DestroyUndead * (manaInvested); };
* *if(activeSpell == SPL_Pyrokinesis * * * ) * { * return *Spell_Logic_Pyrokinesis * * (manaInvested); };
* *if(activeSpell == SPL_Firestorm * * * * ) * { * return *Spell_Logic_Firestorm * * * (manaInvested); };
* *if(activeSpell == SPL_IceWave * * * * * ) * { * return *Spell_Logic_IceWave * * * * (manaInvested); };
* *if(activeSpell == SPL_SummonDemon * * * ) * { * return *Spell_Logic_SummonDemon * * (manaInvested); };
* *if(activeSpell == SPL_FullHeal * * * * *) * { * return *Spell_Logic_FullHeal * * * *(manaInvested); };
* *if(activeSpell == SPL_Firerain * * * * *) * { * return *Spell_Logic_Firerain * * * *(manaInvested); };
* *if(activeSpell == SPL_BreathOfDeath * * ) * { * return *Spell_Logic_BreathOfDeath * (manaInvested); };
* *if(activeSpell == SPL_MassDeath * * * * ) * { * return *Spell_Logic_MassDeath * * * (manaInvested); };
* *if(activeSpell == SPL_ArmyOfDarkness * *) * { * return *Spell_Logic_ArmyOfDarkness *(manaInvested); };
* *if(activeSpell == SPL_Shrink * * * * * *) * { * return *Spell_Logic_Shrink * * * * *(manaInvested); };
* *if(activeSpell == SPL_TrfSheep * * * * *) * { * return *Spell_Logic_TrfSheep * * * *(manaInvested); };
* *if(activeSpell == SPL_TrfScavenger * * *) * { * return *Spell_Logic_TrfScavenger * *(manaInvested); };
* *if(activeSpell == SPL_TrfGiantRat * * * ) * { * return *Spell_Logic_TrfGiantRat * * (manaInvested); };
* *if(activeSpell == SPL_TrfGiantBug * * * ) * { * return *Spell_Logic_TrfGiantBug * * (manaInvested); };
* *if(activeSpell == SPL_TrfWolf * * * * * ) * { * return *Spell_Logic_TrfWolf * * * * (manaInvested); };
* *if(activeSpell == SPL_TrfWaran * * * * *) * { * return *Spell_Logic_TrfWaran * * * *(manaInvested); };
* *if(activeSpell == SPL_TrfSnapper * * * *) * { * return *Spell_Logic_TrfSnapper * * *(manaInvested); };
* *if(activeSpell == SPL_TrfWarg * * * * * ) * { * return *Spell_Logic_TrfWarg * * * * (manaInvested); };
* *if(activeSpell == SPL_TrfFireWaran * * *) * { * return *Spell_Logic_TrfFireWaran * *(manaInvested); };
* *if(activeSpell == SPL_TrfLurker * * * * ) * { * return *Spell_Logic_TrfLurker * * * (manaInvested); };
* *if(activeSpell == SPL_TrfShadowbeast * *) * { * return *Spell_Logic_TrfShadowbeast *(manaInvested); };
* *if(activeSpell == SPL_TrfDragonSnapper *) * { * return *Spell_Logic_TrfDragonSnapper(manaInvested); };
* *if(activeSpell == SPL_Charm * * * * * * ) * { * return *Spell_Logic_Charm * * * * * (manaInvested); };
* *if(activeSpell == SPL_MasterOfDisaster *) * { * return *Spell_Logic_MasterOfDisaster(manaInvested); };
* *if(activeSpell == SPL_ConcussionBolt * *) * { * return *Spell_Logic_ConcussionBolt *(manaInvested); };
* *if(activeSpell == SPL_Deathbolt * * * * ) * { * return *Spell_Logic_Deathbolt * * * (manaInvested); };
* *if(activeSpell == SPL_Deathball * * * * ) * { * return *Spell_Logic_Deathball * * * (manaInvested); };
* *if(activeSpell == SPL_Thunderstorm * * *) * { * return *Spell_Logic_Thunderstorm * *(manaInvested); };
* *if(activeSpell == SPL_Waterfist * * * * ) * { * return *Spell_Logic_Waterfist * * * (manaInvested); };
* *if(activeSpell == SPL_Whirlwind * * * * ) * { * return *Spell_Logic_Whirlwind * * * (manaInvested); };
* *if(activeSpell == SPL_Geyser * * * * * *) * { * return *Spell_Logic_Geyser * * * * *(manaInvested); };
* *if(activeSpell == SPL_Inflate * * * * * ) * { * return *Spell_Logic_Inflate * * * * (manaInvested); };
* *if(activeSpell == SPL_Icelance * * * * *) * { * return *Spell_Logic_Icelance * * * *(manaInvested); };
* *if(activeSpell == SPL_Swarm * * * * * * ) * { * return *Spell_Logic_Swarm * * * * * (manaInvested); };
* *if(activeSpell == SPL_Greententacle * * ) * { * return *Spell_Logic_Greententacle * (manaInvested); };
* *if(activeSpell == SPL_SummonGuardian * *) * { * return *Spell_Logic_SummonGuardian *(manaInvested); };
* *if(activeSpell == SPL_Energyball * * * *) * { * return *Spell_Logic_Energyball * * *(manaInvested); };
* *if(activeSpell == SPL_SuckEnergy * * * *) * { * return *Spell_Logic_SuckEnergy * * *(manaInvested); };
* *if(activeSpell == SPL_Skull * * * * * * ) * { * return *Spell_Logic_Skull * * * * * (manaInvested); };
* *if(activeSpell == SPL_SummonZombie * * *) * { * return *Spell_Logic_SummonZombie * *(manaInvested); };
* *if(activeSpell == SPL_SummonMud * * * * ) * { * return *Spell_Logic_SummonMud * * * (manaInvested); };
* *return SPL_SENDSTOP; // (Моя коррекция)
};

...ещё файл

//************************************************** ************
****************
//Управление процессом высвобождения инвестированной маны для заклинаний
//------------------------------------------------------------------------------
// Данная функция вызывается только экзешником
// self - кастующий НПС (агрессор)
//************************************************** ****************************

//================================================== ===========
// Аргументы:
//-------------------------------------------------------------
// manaInvested - кол-во высвобождаемой маны
//-------------------------------------------------------------
// Возвращаемое значение:
// Одна из констант, управляющая процессом инвестирования маны.
//================================================== ===========

func int Spell_ProcessMana_Release(var int manaInvested)
{
* *var int activeSpell;
* *// получить активное заклинание агрессора
* *activeSpell = Npc_GetActiveSpell(self);
* *// эти заклинания при освобождении маны всегда срабатывают
* *if (activeSpell == SPL_Pyrokinesis *) * { * return *SPL_SENDCAST; * };
* *if (activeSpell == SPL_ChargeFireball) *{ * return *SPL_SENDCAST; * };
* *if (activeSpell == SPL_ChargeZap * *) * { * return *SPL_SENDCAST; * };
* *if (activeSpell == SPL_WINDFIST * * ) * { * return *SPL_SENDCAST; * };
* *// все остальные заклинания завершаются без эффекта
* *return SPL_SENDSTOP;
};

...ещё файл

// ************************************************** ****************
// Прототип всех заклинаний (значения по умолчанию)
// ************************************************** ****************

PROTOTYPE C_Spell_Proto(C_Spell)
{
* *time_per_mana * * * * * * * = 500; * * * * * * *// Время в мс, требуемое для инвестирования маны на один уровень - 500мс
* *damage_per_level * * * * * *= 1; * * * * * * * *// Наносимый урон за уровень заклинания - 1 пункт
* *damageType * * * * * * * * *= DAM_MAGIC; * * * *// Тип повреждения - магия
* *spellType * * * * * * * * * = SPELL_BAD; * * * *// Категория заклинания - плохое
* *canTurnDuringInvest * * * * = 1; * * * * * * * *// Возможность поворота во время инвестирования маны - есть
* *canChangeTargetDuringInvest = 1; * * * * * * * *// Возможность выбора цели во время инвестирования маны - есть
* *isMultiEffect * * * * * * * = 0; * * * * * * * *// Возможность мультиэффектов заклинания - нет
* *targetCollectAlgo * * * * * = TARGET_COLLECT_FOCUS_FALLBACK_NONE; // Константа описания цели - цель визуальный объект в фокусе, при потере фокуса траектория устанавливается заклинанием
* *targetCollectType * * * * * = TARGET_TYPE_NPCS; // Тип цели заклинания - цель НПС
* *targetCollectRange * * * * *= 10000; * * * * * *// Дальность действия - 100м
* *targetCollectAzi * * * * * *= 60; * * * * * * * // Угол азимута - 60 градусов
* *targetCollectElev * * * * * = 60; * * * * * * * // Угол тангажа - 60 градусов
};


Ответить с цитированием
Старый 11.04.2005, 11:44   #141
Vam

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

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

16. Заклинания.

Все файлы заклинаний расположены в директории ..\AI\Magic\Spells\
Все заклинания мы рассматривать не будем, разберем только основные типы и принципы работы.

Все заклинания состоят из следующих частей:
1. Объявление самого заклинания типа INSTANCE Spell_ххх(C_Spell_Proto) с инициализацией требуемых переменных, где ххх - название заклинания.
2. Функция, управляющая процессом инвестирования маны int Spell_Logic_ххх(var int manaInvested). Аргумент int manaInvested определяет кол-во инвестированной маны, функция возвращает одну из констант управления процессом инвестирования маны.
3. Функция вызова самого заклинания void Spell_Cast_ххх() (вызывается только экзешником). Имя ххх должно строго соответствовать ххх при объявлении инстанции.

// *******************************************
// Заклинание Свет
// *******************************************

const int SPL_Cost_LIGHT * * * *= 10; * // кол-во требуемой маны

const int SPL_Duration_LIGHT * *= 5; * *// время действия заклинания в минутах

// объявление заклинания с инициализацией
INSTANCE Spell_Light(C_Spell_Proto)
{
* *time_per_mana * * * * * = 500;
* *spelltype * * * * * * * = SPELL_NEUTRAL;
* *targetCollectAlgo * * * = TARGET_COLLECT_NONE;
* *targetCollectRange * * *= 0;
* *targetCollectAzi * * * *= 0;
* *targetCollectElev * * * = 0;
};

// функция инвестирования маны
func int Spell_Logic_Light(var int manaInvested)
{
* *// если активное заклинание свиток и есть требуемое кол-во маны
* *if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
* *{
* * * *// старт заклинания
* * * *return SPL_SENDCAST;
* *}
* *// иначе, если руна и есть требуемое кол-во маны
* *else if (self.attribute[ATR_MANA] >= SPL_Cost_Light)
* *{ *
* * * *// старт заклинания
* * * *return SPL_SENDCAST;
* *}
* *else // мало маны
* *{
* * * *// отмена заклинания
* * * *return SPL_SENDSTOP;
* *};
};

// вызов заклинания
func void Spell_Cast_Light()
{
* *// если свиток
* *if(Npc_GetActiveSpellIsScroll(self))
* *{
* * * *// уменьшение маны на стоимость свитков
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
* *}
* *else // руна
* *{
* * * *// уменьшение маны на фактическую стоимость заклинания
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Light;
* *};
* *// изменить случайное число выбора заклинаний
* *self.aivar[AIV_SelectSpell] += 1;
};

По такому принципу работают большинство заклинаний, это:


SPL_PalLight * * * * * *//Святой свет, * * * * * * * * * * *// файл Spell_Light_Alle.d
SPL_PalLightHeal * * * *//Малое лечение паладина * * * * * *// файл Spell_Heal_Alle.d
SPL_PalMediumHeal * * * //Среднее лечение паладина
SPL_PalFullHeal * * * * //Сильное лечение паладина
SPL_LightHeal * * * * * //Лечить легкое ранение
SPL_MediumHeal * * * * *//Лечить среднее ранение
SPL_FullHeal * * * * * *//Лечить сильное ранение
SPL_PalHolyBolt * * * * //Святая стрела * * * * * * * * * * // файл Spell_PalHolyBolt.d
SPL_PalRepelEvil * * * *//Разогнать дьяволов * * * * * * * *// файл Spell_PalRepelEvil.d
SPL_PalDestroyEvil * * *//Уничтожить дьяволов * * * * * * * // файл Spell_PalDestroyEvil.d
SPL_Firebolt * * * * * *//Огненная стрела * * * * * * * * * // файл Spell_FireBolt.d
SPL_Zap * * * * * * * * //Молния * * * * * * * * * * * * * *// файл Spell_Zap.d
SPL_Icebolt * * * * * * //Ледяная стрела * * * * * * * * * *// файл Spell_IceBolt.d
SPL_InstantFireball * * //Огненный шар * * * * * * * * * * *// файл Spell_InstantFireball.d
SPL_LightningFlash * * *//Удар молнии * * * * * * * * * * * // файл Spell_LightningFlash.d
SPL_IceCube * * * * * * //Ледяная глыба * * * * * * * * * * // файл Spell_IceCube.d
SPL_DestroyUndead * * * //Уничтожить нежить * * * * * * * * // файл Spell_DestroyUndead.d
SPL_Firestorm * * * * * //Малая огненная буря * * * * * * * // файл Spell_Firestorm.d
SPL_IceWave * * * * * * //Ледяная волна * * * * * * * * * * // файл Spell_IceWave.d
SPL_Firerain * * * * * *//Огненный дождь * * * * * * * * * *// файл Spell_Firerain.d
SPL_BreathOfDeath * * * //Дым смерти * * * * * * * * * * * *// файл Spell_BreathOfDeath.d
SPL_MassDeath * * * * * //Волна смерти * * * * * * * * * * *// файл Spell_MassDeath.d
SPL_MasterOfDisaster * *//Святой удар * * * * * * * * * * * // файл Spell_MasterOfDisaster.d
SPL_Deathbolt * * * * * //Стрела смерти * * * * * * * * * * // файл Spell_DeathBolt.d
SPL_Deathball * * * * * //Шар смерти * * * * * * * * * * * *// файл Spell_DeathBall.d
SPL_ConcussionBolt * * *//Стрела сотрясения * * * * * * * * // файл Spell_ConcussionBolt.d
SPL_Thunderstorm * * * *//Шторм * * * * * * * * * * * * * * // файл Spell_Thunderstorm.d
SPL_Whirlwind * * * * * //Смерч * * * * * * * * * * * * * * // файл Spell_Whirlwind.d
SPL_WaterFist * * * * * //Кулак воды * * * * * * * * * * * *// файл Spell_WaterFist.d
SPL_IceLance * * * * * *//Ледяное копье * * * * * * * * * * // файл Spell_IceLance.d
SPL_Geyser * * * * * * *//Гейзер * * * * * * * * * * * * * *// файл Spell_Geyser.d
SPL_Swarm * * * * * * * //Рой * * * * * * * * * * * * * * * // файл Spell_Swarm.d
SPL_GreenTentacle * * * //Зеленые щупальца * * * * * * * * *// файл Spell_GreenTentacle.d
SPL_Energyball * * * * *//Шар энергии * * * * * * * * * * * // файл Spell_EnergyBall.d
SPL_SuckEnergy * * * * *//Украсть энергию * * * * * * * * * // файл Spell_SuckEnergy.d
SPL_Skull * * * * * * * //Крик мертвых * * * * * * * * * * *// файл Spell_Skull.d


Телепортация.
// *************************
// Заклинания телепортации
// *************************

// стоимость заклинаний
const int SPL_Cost_Teleport * * = 10;

// Вывод сообщения о недоступности телепорта
// -------------------------------------------------------
// Level - уровень на котором находится телепорт прибытия
func void B_PrintTeleportTooFarAway(var int Level)
{
* *// если телепортация на другой уровень
* *if(Level != CurrentLevel)
* *{
* * * *// вывод сообщения "Слишком далеко"
* * * *PrintScreen(PRINT_TeleportTooFarAway,-1,YPOS_LevelUp,FONT_ScreenSmall,2);
* *};
};

// Инициализация заклинаний
INSTANCE Spell_Teleport(C_Spell_Proto)
{
* *time_per_mana * * * * * = 0;
* *spelltype * * * * * * * = SPELL_NEUTRAL;
* *targetCollectAlgo * * * = TARGET_COLLECT_CASTER;
* *canTurnDuringInvest * * = 0;
* *targetCollectRange * * *= 0;
* *targetCollectAzi * * * *= 0;
* *targetCollectElev * * * = 0;
};

// Функции инвестирования маны для всех заклинаний телепортации идентичны ранее рассмотренной
func int Spell_Logic_PalTeleportSecret(var int manaInvested)
{
* *if (Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
* *{
* * * *return SPL_SENDCAST;
* *}
* *else if (self.attribute[ATR_MANA] >= SPL_Cost_Teleport)
* *{
* * * *return SPL_SENDCAST;
* *};
* *return SPL_NEXTLEVEL;
};

// Функции вызова заклинаний телепортации
func void Spell_Cast_PalTeleportSecret()
{
* *// вывод сообщения о недоступности телепорта
* *B_PrintTeleportTooFarAway(NEWWORLD_ZEN);
* *if (Npc_GetActiveSpellIsScroll(self))
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
* *}
* *else
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Teleport;
* *};
* *// телепортация в нужную точку
* *AI_Teleport(self,"NW_PAL_SECRETCHAMBER");
* *// анимация телепортации
* *AI_PlayAni(self,"T_HEASHOOT_2_STAND" );
};

// Остальные функции вызова заклинаний телепортации идентичны приведенной

// Вызов соответствующей функции телепортации в зависимости от активного заклинания
func void Spell_Cast_Teleport()
{
* *if (Npc_GetActiveSpell(self) == SPL_PalTeleportSecret * ) * { * Spell_Cast_PalTeleportSecret * *(); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportSeaport * * ) * { * Spell_Cast_TeleportSeaport * * *(); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportMonastery * ) * { * Spell_Cast_TeleportMonastery * *(); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportFarm * * * *) * { * Spell_Cast_TeleportFarm * * * * (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportXardas * * *) * { * Spell_Cast_TeleportXardas * * * (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportPassNW * * *) * { * Spell_Cast_TeleportPassNW * * * (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportPassOW * * *) * { * Spell_Cast_TeleportPassOW * * * (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportOC * * * * *) * { * Spell_Cast_TeleportOC * * * * * (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportOWDemonTower) * { * Spell_Cast_TeleportOWDemonTower (); };
* *if (Npc_GetActiveSpell(self) == SPL_TeleportTaverne * * ) * { * Spell_Cast_TeleportTaverne * * *(); };
};

Заклинания вызова монстров рассмотрим на примере вызова Волка

// **************
// Вызов Волка
// **************

// стоимость заклинания
const int SPL_Cost_SummonWolf * = 40;

// Инициализация заклинания
INSTANCE Spell_SummonWolf(C_Spell_Proto)
{
* *time_per_mana * * * * * = 0;
* *targetCollectAlgo * * * = TARGET_COLLECT_NONE;
};

// Функция инвестирования маны идентична ранее рассмотренным
func int Spell_Logic_SummonWolf(var int manaInvested)
{
* *if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
* *{
* * * *return SPL_SENDCAST;
* *}
* *else if(self.attribute[ATR_MANA] >= SPL_Cost_SummonWolf)
* *{ * * *
* * * *return SPL_SENDCAST;
* *}
* *else
* *{
* * * *return SPL_SENDSTOP;
* *};
* *
};

// Вызов заклинания
func void Spell_Cast_SummonWolf()
{
* *if(Npc_GetActiveSpellIsScroll(self))
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
* *}
* *else
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonWolf;
* *};
* *// если заклинание применяет ГГ
* *if(Npc_IsPlayer(self))
* *{
* * * *// рождение Вызванного волка (1 штука на 5 минут)
* * * *Wld_SpawnNpcRange(self,Summoned_Wolf,1,500);
* *}
* *else
* *{
* * * *// рождение Волка
* * * *Wld_SpawnNpcRange(self,Wolf,1,500);
* *};
* *self.aivar[AIV_SelectSpell] += 1;
};

По такому принципу работают заклинания:

SPL_SummonGoblinSkeleton * *//Вызвать скелет гоблина * * * *// файл Spell_SummonGoblinSkeleton.d
SPL_SummonSkeleton * * * * *//Вызвать скелет * * * * * * * *// файл Spell_SummonSkeleton.d
SPL_SummonGolem * * * * * * //Вызвать голема * * * * * * * *// файл Spell_SummonGolem.d
SPL_SummonDemon * * * * * * //Вызвать демона * * * * * * * *// файл Spell_SummonDemon.d
SPL_ArmyOfDarkness * * * * *//Армия мрака * * * * * * * * * // файл Spell_ArmyOfDarkness.d
SPL_SummonGuardian * * * * *//Создать стража * * * * * * * *// файл Spell_SummonGuardian.d
SPL_SummonZombie * * * * * *//Создать зомби * * * * * * * * // файл Spell_SummonZombie.d
SPL_SummonMud * * * * * * * //Вызвать Муда * * * * * * * * *// файл Spell_SummonMud.d

Ответить с цитированием
Старый 13.04.2005, 10:30   #142
Vam

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

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

Заклинания, требующие несколько уровней инвестирования маны, рассмотрим на примере заклинания "Порыв ветра"

// ************************
// Заклинание Порыв ветра
// ************************

const int SPL_Cost_WindFist * * = 80; * // полная стоимость заклинания
const int STEP_WindFist * * * * = 20; * // стоимость одного уровня заклинания
const int SPL_Damage_WindFist * = 50; * // ущерб наносимый заклинанием на уровень

// объявление заклинания с инициализацией
INSTANCE Spell_WindFist(C_Spell_Proto)
{
* *time_per_mana * * * * * = 30;
* *damage_per_level * * * *= SPL_Damage_WindFist;
* *damageType * * * * * * *= DAM_FLY;
* *canTurnDuringInvest * * = TRUE;
* *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS_FALLBACK_NONE;
* *targetCollectRange * * *= 1000;
* *targetCollectType * * * = TARGET_TYPE_NPCS;
};

// функция инвестирования маны
func int Spell_Logic_WindFist(var int manaInvested)
{
* *// если недостаточно маны на уровень заклинания
* *if(self.attribute[ATR_MANA] < STEP_WindFist)
* *{
* * * *// инвестирование маны невозможно
* * * *return SPL_DONTINVEST;
* *};
* *// если инвестировано маны < 1 уровня
* *if(manaInvested <= STEP_WindFist*1)
* *{
* * * *// установить уровень 1
* * * *self.aivar[AIV_SpellLevel] = 1;
* * * *// инвестированной маны недостаточно для перехода на следующий уровень
* * * *return SPL_STATUS_CANINVEST_NO_MANADEC;
* *}
* *// если инвестировано маны > требуемой для 1 уровня и уровень не выше первого
* *else if(manaInvested > (STEP_WindFist*1)) && (self.aivar[AIV_SpellLevel] <= 1)
* *{
* * * *// уменьшение маны на уровень
* * * *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist);
* * * *// если мана < 0
* * * *if(self.attribute[ATR_MANA] < 0)
* * * *{
* * * * * *// мана = 0
* * * * * *self.attribute[ATR_MANA] = 0;
* * * *};
* * * *// установить уровень 2
* * * *self.aivar[AIV_SpellLevel] = 2;
* * * *// переход на следующий уровень
* * * *return SPL_NEXTLEVEL;
* *}
* *// аналогично приведенному выше для следующих уровней заклинания
* *else if(manaInvested > (STEP_WindFist*2)) && (self.aivar[AIV_SpellLevel] <= 2)
* *{
* * * *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist);
* * * *if(self.attribute[ATR_MANA] < 0)
* * * *{
* * * * * *self.attribute[ATR_MANA] = 0;
* * * *};
* * * *self.aivar[AIV_SpellLevel] = 3;
* * * *return SPL_NEXTLEVEL;
* *}
* *else if(manaInvested > (STEP_WindFist*3)) && (self.aivar[AIV_SpellLevel] <= 3)
* *{
* * * *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist);
* * * *if(self.attribute[ATR_MANA] < 0)
* * * *{
* * * * * *self.attribute[ATR_MANA] = 0;
* * * *};
* * * *self.aivar[AIV_SpellLevel] = 4;
* * * *return SPL_NEXTLEVEL;
* *}
* *// если достигнут последний уровень
* *else if(manaInvested > (STEP_WindFist*3)) && (self.aivar[AIV_SpellLevel] == 4)
* *{
* * * *// дальнейшее инвестирование маны невозможно
* * * *return SPL_DONTINVEST; *
* *};
* *// инвестированной маны недостаточно для перехода на следующий уровень
* *return SPL_STATUS_CANINVEST_NO_MANADEC;
};

// вызов заклинания
// где spellLevel - достигнутый уровень заклинания
func void Spell_Cast_WindFist(var int spellLevel)
{
* *// уменьшение маны для последнего уровня
* *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist);
* *if(self.attribute[ATR_MANA] < 0)
* *{
* * * *self.attribute[ATR_MANA] = 0;
* *}; *
* *// изменить случайное число выбора заклинаний
* *self.aivar[AIV_SelectSpell] += 1;
};

По такому принципу работают следующие заклинания:

SPL_ChargeFireball * * *//Большой огненный шар * * * * * * *// файл Spell_ChargeFireball.d
SPL_ChargeZap * * * * * //Шаровая молния * * * * * * * * * *// файл Spell_ChargeZap.d
SPL_Pyrokinesis * * * * //Большая огненная буря * * * * * * // файл Spell_Pyrokinesis.d


Трансформация

// **************************
// Заклинания трансформации
// **************************

// стоимости заклинаний
const int SPL_Cost_TrfSheep * * * * = 10;
const int SPL_Cost_TrfScavenger * * = 10;
const int SPL_Cost_TrfGiantRat * * *= 10;
const int SPL_Cost_TrfGiantBug * * *= 10;
const int SPL_Cost_TrfWolf * * * * *= 10;
const int SPL_Cost_TrfWaran * * * * = 10;
const int SPL_Cost_TrfSnapper * * * = 10;
const int SPL_Cost_TrfWarg * * * * *= 10;
const int SPL_Cost_TrfFireWaran * * = 10;
const int SPL_Cost_TrfLurker * * * *= 10;
const int SPL_Cost_TrfShadowbeast * = 10;
const int SPL_Cost_TrfDragonSnapper = 10;

// общая инициализация для всех заклинаний
INSTANCE Spell_Transform(C_Spell_Proto)
{
* *time_per_mana * * * * * = 0;
* *spelltype * * * * * * * = SPELL_NEUTRAL;
* *targetCollectAlgo * * * = TARGET_COLLECT_NONE;
* *canTurnDuringInvest * * = 0;
};

// Функции инвестирования маны у всех заклинаний трансформации практически одинаковы, рассмотрим одну их них
func int Spell_Logic_TrfSheep(var int manaInvested)
{
* *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны
* *if((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll)))
* *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_TrfSheep)
* *{
* * * *// уменьшить ману на стоимость заклинания для руны
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_TrfSheep;
* * * *// ссылка на объявление (инстанцию) зверюшки, в которую превращаемся
* * * *Npc_SetActiveSpellInfo(self,Sheep);
* * * *// старт заклинания
* * * *return SPL_SENDCAST;
* *}
* *else
* *{
* * * *// заклинание невозможно
* * * *return SPL_SENDSTOP;
* *};
};

Функция вызова заклинания здесь отсутствует, вызов выполняется экзешником напрямую.
Ответить с цитированием
Старый 14.04.2005, 10:00   #143
Vam

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

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

Прочие заклинания.

// ****************
// Заклинание Сон
// ****************
// self - кастующий НПС
// other - НПС цель

const int SPL_Cost_Sleep * *= 30; * // стоимость маны *
const int SPL_TIME_Sleep * *= 30; * // время сна в сек

// Инициализация заклинания
instance Spell_Sleep(C_Spell_Proto)
{
* *time_per_mana * * * * * = 0;
* *spelltype * * * * * * * = SPELL_NEUTRAL;
* *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS;
};

// Функция инвестирования маны
func int Spell_Logic_Sleep(var int manaInvested)
{
* *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны
* *if((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll)))
* *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_Sleep)
* *{
* * * *// если свиток
* * * *if(Npc_GetActiveSpellIsScroll(self))
* * * *{
* * * * * *// израсходовать ману
* * * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
* * * *}
* * * *else // руна
* * * *{
* * * * * *// израсходовать ману
* * * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Sleep;
* * * *};
* * * *// если цель не плывет и не ныряет и не обездвижена и
* * * *if (!C_BodyStateContains(other,BS_SWIM)) && (!C_BodyStateContains(other,BS_DIVE)) && (!C_NpcIsDown(other))
* * * *&& (other.guild < GIL_SEPERATOR_HUM) * * * *// человек
* * * *&& (other.flags != NPC_FLAG_IMMORTAL) * * * // и уязвима
* * * *&& (Npc_GetDistToNpc(self,other) <= 1000) * // и расстояние между кастующим и целью < 10м
* * * *&& (other.guild != GIL_KDF) * * * * * * * * // и цель не Маг огня
* * * *&& (other.guild != GIL_DMT) * * * * * * * * // и не Черный маг
* * * *&& (other.guild != GIL_PAL) * * * * * * * * // и не Паладин
* * * *{
* * * * * *// очистить очередь AI состояний цели
* * * * * *Npc_ClearAIQueue(other);
* * * * * *// очистить восприятия цели
* * * * * *B_ClearPerceptions(other);
* * * * * *// перевести цель в состояние Магического сна
* * * * * *AI_StartState(other,ZS_MagicSleep,0,"");
* * * *};
* * * *return SPL_SENDCAST;
* *}
* *else
* *{
* * * *return SPL_SENDSTOP;
* *};
};

// Вызов заклинания
func void Spell_Cast_Sleep()
{
* *// изменить случайное число выбора заклинаний
* *self.aivar[AIV_SelectSpell] += 1;
};

...ещё файл

// *****************************
// Заклинание Уменьшить монстра
// *****************************

const int SPL_Cost_Shrink * = 300; // стоимость маны

// Инициализация заклинания
INSTANCE Spell_Shrink(C_Spell_Proto)
{
* *time_per_mana * * * * * = 0;
* *spelltype * * * * * * * = SPELL_NEUTRAL;
* *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS;
* *targetCollectRange * * *= 1000;
};

// Функция инвестирования маны (аналогична ранее рассмотренным)
func int Spell_Logic_Shrink(var int manaInvested)
{
* *if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
* *{
* * * *return SPL_SENDCAST;
* *}
* *else if(self.attribute[ATR_MANA] >= SPL_Cost_Shrink)
* *{
* * * *return SPL_SENDCAST;
* *}
* *else
* *{
* * * *return SPL_SENDSTOP;
* *};
};

// Вызов заклинания
func void Spell_Cast_Shrink()
{
* *// если свиток
* *if(Npc_GetActiveSpellIsScroll(self))
* *{
* * * *// израсходовать ману для свитка
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
* *}
* *else
* *{
* * * *// израсходовать ману для руны
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Shrink;
* *};
* *// если цель уязвима и не обездвижена и монстр и не уменьшена
* *if(other.flags != NPC_FLAG_IMMORTAL) && (!C_NpcIsUndead(other)) && (other.guild > GIL_SEPERATOR_HUM) && (other.aivar[AIV_MM_ShrinkState] == 0)
* *{
* * * *// очистить очередь AI состояний цели
* * * *Npc_ClearAIQueue(other);
* * * *// очистить восприятия цели
* * * *B_ClearPerceptions(other);
* * * *// перевести цель в состояние уменьшения
* * * *AI_StartState(other,ZS_MagicShrink,0,"");
* *};
* *// изменить случайное число выбора заклинаний
* *self.aivar[AIV_SelectSpell] += 1;
};

...ещё файл

// *******************
// Заклинание Раздуть
// *******************

const int SPL_Cost_Inflate * * *= 10; * // стоимость маны
const int SPL_Inflate_Damage * *= 5; * *// ущерб от заклинания
const int SPL_TIME_Inflate * * *= 19; * // время действия 19 сек

// Инициализация заклинания
instance Spell_Inflate(C_Spell_Proto)
{
* *time_per_mana * * * * * = 0;
* *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS;
};

// Функция инвестирования маны
func int Spell_Logic_Inflate(var int manaInvested)
{
* *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны
* *if ((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll)))
* *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_Inflate)
* *{
* * * *// если свиток
* * * *if(Npc_GetActiveSpellIsScroll(self))
* * * *{
* * * * * *// израсходовать ману для свитка
* * * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
* * * *}
* * * *else
* * * *{
* * * * * *// израсходовать ману для руны
* * * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Inflate;
* * * *};
* * * *// если цель не плывет и не ныряет и не обездвижена и
* * * *if(!C_BodyStateContains(other,BS_SWIM)) && (!C_BodyStateContains(other,BS_DIVE)) && (!C_NpcIsDown(other))
* * * *&& (other.guild < GIL_SEPERATOR_HUM) * * * *// человек
* * * *&& (other.flags != NPC_FLAG_IMMORTAL) * * * // и уязвима
* * * *&& (Npc_GetDistToNpc(self,other) <= 1000) * // и расстояние между кастующим и целью < 10м
* * * *&& (other.guild != GIL_KDF) * * * * * * * * // и цель не Маг огня
* * * *&& (other.guild != GIL_DMT) * * * * * * * * // и не Черный маг
* * * *&& (other.guild != GIL_PAL) * * * * * * * * // и не Паладин
* * * *{
* * * * * *// очистить очередь AI состояний цели
* * * * * *Npc_ClearAIQueue(other);
* * * * * *// очистить восприятия цели
* * * * * *B_ClearPerceptions(other);
* * * * * *// перевести цель в состояние Раздутия
* * * * * *AI_StartState(other,ZS_Inflate,0,"");
* * * *};
* * * *return SPL_SENDCAST;
* *}
* *else
* *{
* * * *return SPL_SENDSTOP;
* *};
};

// Вызов заклинания
func void Spell_Cast_Inflate()
{
* *// изменить случайное число выбора заклинаний
* *self.aivar[AIV_SelectSpell] += 1;
};

...ещё файл

// ******************
// Заклинание Страх
// ******************

const int SPL_Cost_Fear * * = 50; * // стоимость маны
const int SPL_TIME_Fear * * = 5; * *// время действия 5 сек

// Инициализация заклинания
INSTANCE Spell_Fear(C_Spell_Proto)
{
* *time_per_mana * * * * * = 0;
* *damage_per_level * * * *= 0;
* *targetCollectAlgo * * * = TARGET_COLLECT_NONE;
};

// Функция инвестирования маны (аналогична рассмотренным)
func int Spell_Logic_Fear(var int manaInvested)
{ *
* *if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
* *{
* * * *return SPL_SENDCAST;
* *}
* *else if(self.attribute[ATR_MANA] >= SPL_Cost_Fear)
* *{ *
* * * *return SPL_SENDCAST;
* *}
* *else
* *{
* * * *return SPL_SENDSTOP;
* *};
};

// Вызов заклинания
func void Spell_Cast_Fear()
{
* *// если цель не Дракон
* *if(other.guild != GIL_DRAGON)
* *{
* * * *// перевести всех НПС, находящихся на расстоянии 10м от кастующего, в состояние страха
* * * *AI_SetNpcsToState(self,ZS_MagicFlee,1000);
* *};
* *// израсходовать ману (аналогично рассмотренным заклинаниям)
* *if(Npc_GetActiveSpellIsScroll(self))
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
* *}
* *else
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Fear;
* *};
* *self.aivar[AIV_SelectSpell] += 1;
};

...ещё файл

// ******************
// Заклинание Забыть
// ******************

const int SPL_Cost_Charm * * * *= 50; * // стоимость маны
const int SPL_Damage_Charm * * *= 0; * *// причиняемый ущерб

// Инициализация заклинания
INSTANCE Spell_Charm(C_Spell_Proto)
{
* *time_per_mana * * * * * = 0;
* *spelltype * * * * * * * = SPELL_NEUTRAL;
* *damage_per_level * * * *= SPL_Damage_Charm;
* *damageType * * * * * * *= DAM_MAGIC;
};

// Функция инвестирования маны
func int Spell_Logic_Charm(var int manaInvested)
{
* *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны
* *if ((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll)))
* *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_Charm)
* *{
* * * *// если НПС цель видел криминал ГГ и квест Игназа в стадии выполнения
* * * *if(other.aivar[AIV_NpcSawPlayerCommit] != CRIME_NONE) && (MIS_Ignaz_Charm == LOG_RUNNING)
* * * *{
* * * * * *// тест заклинания проведен
* * * * * *Charm_Test = TRUE;
* * * *};
* * * *// удалить криминал ГГ для соответствующей локации
* * * *B_DeletePetzCrime(other);
* * * *// очистить что цель видела криминал
* * * *other.aivar[AIV_NpcSawPlayerCommit] = CRIME_NONE;
* * * *// последнего сражения с ГГ не было
* * * *other.aivar[AIV_LastFightAgainstPlayer] = FIGHT_NONE;
* * * *// если гильдии цели и кастующего не враги
* * * *if(Wld_GetGuildAttitude(other.guild,self.guild) != ATT_HOSTILE)
* * * *{ *
* * * * * *// если отношение цели и кастующего враждебно
* * * * * *if(Npc_GetAttitude(other,self) == ATT_HOSTILE)
* * * * * *{
* * * * * * * *// установить отношение цели к кастующему равное отношению их гильдий
* * * * * * * *Npc_SetTempAttitude(other,Wld_GetGuildAttitude(ot her.guild,self.guild));

* * * * * *};
* * * *};
* * * *return SPL_SENDCAST;
* *}
* *else
* *{
* * * *return SPL_SENDSTOP;
* *};
};

// Вызов заклинания (идентичен ранее рассмотренным)
func void Spell_Cast_Charm()
{
* *if(Npc_GetActiveSpellIsScroll(self))
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
* *}
* *else
* *{
* * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Charm;
* *};
* *self.aivar[AIV_SelectSpell] += 1;
};

Ответить с цитированием
Старый 15.04.2005, 11:17   #144
Vam

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

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

2Нифариус:
Подскажите, как с помощью скрипта создать эффект одержимости (расплывающийся красный экран во время разговора).
Вызвать вот эти эффекты:
* * *Wld_PlayEffect("DEMENTOR_FX",hero,hero,0,0,0,FALS E);
* * *Wld_PlayEffect("spellFX_INCOVATION_RED",self,self ,0,0,0,FALSE);

----------------------------------------------------------------------

17. Обработчики состояний заклинаний.

Все обработчики расположены в директории скриптов ..\AI\Magic\ZS_Magic в одноименных файлах.


//************************************************** **
// Обработчик состояния заклинания Зеленые щупальца
//************************************************** **

// ----------------------------------------------------
// self - жертва заклинания
// ----------------------------------------------------

// Функция реакции на локальное восприятие магии (заклинания)
func void B_RestartGreententacle()
{
* *// если последнее примененное заклинание Зеленые щупальца
* *if(Npc_GetLastHitSpellID(self) == SPL_Greententacle)
* *{
* * * *// сбросить время нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self,0);
* *};
};

// Закончить действие заклинания
func void B_StopGreententacle()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если НПС человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* *};
};

// Инициализация состояния
func void ZS_Greententacle()
{
* *// установить локальное восприятие на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartGre ententacle);
* *// разрешить восприятие повреждения
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);
* *// остановить проигрывание файлов анимации заклинания
* *Npc_StopAni(self,"s_GreententacleA_Victim");
* *Npc_StopAni(self,"s_GreententacleB_Victim");
* *Npc_StopAni(self,"s_GreententacleC_Victim");
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp * * *(self);
* *// если НПС находится не в бессознательном состоянии
* *if(!C_BodyStateContains(self,BS_UNCONSCIOUS))
* *{
* * * *// если жертва человек
* * * *if(self.guild < GIL_SEPERATOR_HUM)
* * * *{
* * * * * *var int randy;
* * * * * *//randy = Hlp_Random(3);
* * * * * *// проигрывается анимация бессознательного состояния (Примечание: т.к. предыдущая строка в скрипте закрыта, то randy всегда имеет значение 0)
* * * * * *if(randy == 0) *{ AI_PlayAniBS(self,"T_STAND_2_GREENTENTACLEA_VICTIM ",BS_UNCONSCIOUS); };
* * * * * *if(randy == 1) *{ AI_PlayAniBS(self,"T_STAND_2_GREENTENTACLEB_VICTIM ",BS_UNCONSCIOUS); };
* * * * * *if(randy == 2) *{ AI_PlayAniBS(self,"T_STAND_2_GREENTENTACLEC_VICTIM ",BS_UNCONSCIOUS); };
* * * *}
* * * *else
* * * *{
* * * * * *// анимация бессознательного состояния
* * * * * *AI_PlayAniBS(self,"T_STAND_2_FREEZE_VICTIM",BS_UN CONSCIOUS);
* * * *};
* *};
};

// Функция цикла состояния
func int ZS_Greententacle_Loop ()
{ *
* *// если время в состоянии > времени действия заклинания
* *if(Npc_GetStateTime(self) > SPL_TIME_Greententacle)
* *{
* * * *// остановить действие заклинания
* * * *B_StopGreententacle();
* * * *return LOOP_END;
* *};
* *return * * * * * * *LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_GreenTentacle_End()
{
};

... ещё файл

// ****************************************
// Обработчик состояния заклинания Раздуть
// ****************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Функция реакции на локальное восприятие магии (заклинания)
func void B_RestartInflate()
{
* *// если последнее примененное заклинание Раздуть
* *if(Npc_GetLastHitSpellID(self) == SPL_Inflate)
* *{
* * * *// сбросить время нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self,0);
* *};
};

// Закончить действие заклинания
func void B_StopInflate()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* *};
};

// Инициализация состояния
func void ZS_Inflate()
{
* *// установить локальное восприятие на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartInf late);
* *// остановить проигрывание файла анимации заклинания
* *Npc_StopAni(self,"S_INFLATE_VICTIM");
* *// если НПС находится не в бессознательном состоянии
* *if(!C_BodyStateContains(self,BS_UNCONSCIOUS))
* *{
* * * *// анимация бессознательного состояния
* * * *AI_PlayAniBS(self,"T_STAND_2_INFLATE_VICTIM",BS_U NCONSCIOUS);
* *};
* *// сброс времени цикла
* *self.aivar[AIV_InflateStateTime] = 0;
};

// Функция цикла состояния
func int ZS_Inflate_Loop ()
{ *
* *// если время в состоянии > времени действия заклинания
* *if(Npc_GetStateTime(self) > SPL_TIME_Inflate)
* *{
* * * *// остановить действие заклинания
* * * *B_StopInflate();
* * * *return LOOP_END;
* *};
* *// если текущее время состояния не равно времени цикла
* *if(Npc_GetStateTime(self) != self.aivar[AIV_InflateStateTime])
* *{
* * * *// в зависимости от времени состояния установить жирность (объем) фигуры жертвы
* * * *// как видим по коэффициентам объема сначала идет раздутие фигуры, а затем возвращение к нормальному состоянию
* * * *if(Npc_GetStateTime(self) == 1) * * * { *Mdl_SetModelFatness(self,1); * }
* * * *else if(Npc_GetStateTime(self) == 2) *{ *Mdl_SetModelFatness(self,3); * }
* * * *else if(Npc_GetStateTime(self) == 3) *{ *Mdl_SetModelFatness(self,8 ); * }
* * * *else if(Npc_GetStateTime(self) == 4) *{ *Mdl_SetModelFatness(self,12); *}
* * * *else if(Npc_GetStateTime(self) == 5)
* * * *{ *
* * * * * *Mdl_SetModelFatness(self,9);
* * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"
* * * * * *B_Say(self,other,"$Aargh_1");
* * * *}
* * * *else if(Npc_GetStateTime(self) == 6) *{ *Mdl_SetModelFatness (self,15); }
* * * *else if(Npc_GetStateTime(self) == 7) *{ *Mdl_SetModelFatness (self,18 ); }
* * * *else if(Npc_GetStateTime(self) == 8 )
* * * *{
* * * * * *Mdl_SetModelFatness(self,11); *
* * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"
* * * * * *B_Say (self, other, "$Aargh_2");
* * * *}
* * * *else if(Npc_GetStateTime(self) == 9) *{ *Mdl_SetModelFatness(self,15); *}
* * * *else if(Npc_GetStateTime(self) == 10) { *Mdl_SetModelFatness(self,13); *}
* * * *else if(Npc_GetStateTime(self) == 11) { *Mdl_SetModelFatness(self,12); *}
* * * *else if(Npc_GetStateTime(self) == 12) { *Mdl_SetModelFatness(self,10); *}
* * * *else if(Npc_GetStateTime(self) == 13) { *Mdl_SetModelFatness(self,8 ); * }
* * * *else if(Npc_GetStateTime(self) == 14)
* * * *{
* * * * * *Mdl_SetModelFatness(self,5);
* * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"
* * * * * *B_Say(self,other,"$Aargh_3");
* * * *}
* * * *else if(Npc_GetStateTime(self) == 15) *{ *Mdl_SetModelFatness(self,6); *}
* * * *else if(Npc_GetStateTime(self) == 16) *{ *Mdl_SetModelFatness(self,4); *}
* * * *else if(Npc_GetStateTime(self) == 17) *{ *Mdl_SetModelFatness(self,2); *}
* * * *else if(Npc_GetStateTime(self) == 18 ) *{ *Mdl_SetModelFatness(self,1); *}
* * * *else if(Npc_GetStateTime(self) == 19) *{ *Mdl_SetModelFatness(self,1); *};
* * * *// установить время уикла на текущее время
* * * *self.aivar[AIV_InflateStateTime] = Npc_GetStateTime(self);
* * * *// если жизнь жертвы > ущерба заклинания
* * * *if(self.attribute[ATR_HITPOINTS] > SPL_Inflate_DAMAGE)
* * * *{
* * * * * *// нанести ужерб жертве
* * * * * *B_MagicHurtNpc(other,self,SPL_Inflate_DAMAGE);
* * * *}
* * * *else
* * * *{
* * * * * *// нанести полный ужерб жертве (смерть)
* * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Inflate_End()
{
};

... ещё файл

// ************************************************** *********
// Обработчик состояния магического горения
// -----------------------------------------------------------
// В это состояние НПС переводится экзешником, а не скриптами
// ************************************************** *********

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

const int SPL_MAGICBURN_DAMAGE_PER_SEC = 1; // ущерб в сек от заклинания

// Закончить действие заклинания
func void B_StopMagicBurn()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* * * *// продолжить распорядок дня НПС (т.к. не было принудительного перевода НПС в это состояние из скриптов и завершение этого состояния выполняется не из цикла состояния)
* * * *AI_ContinueRoutine(self);
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* * * *// продолжить распорядок дня НПС
* * * *AI_ContinueRoutine(self);
* *};
}; *

// Функция реакции на локальное восприятие магии (заклинания)
func void B_RestartBurn()
{
* *// если последнее примененное заклинание
* *if (Npc_GetLastHitSpellID(self) == SPL_Firerain) * * * * * *// Огненный дождь
* *¦¦ (Npc_GetLastHitSpellID(self) == SPL_ChargeFireball) * * *// или Большой огненный шар
* *¦¦ (Npc_GetLastHitSpellID(self) == SPL_InstantFireball) * * // или Огненный шар
* *¦¦ (Npc_GetLastHitSpellID(self) == SPL_Firebolt) * * * * * *// или Огненная стрела
* *{
* * * *// сбросить время нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self,0);
* * * *return;
* *};
* *// если последнее примененное заклинание
* *if (Npc_GetLastHitSpellID(self) == SPL_IceWave) * * * * * * // Ледяная волна
* *¦¦ (Npc_GetLastHitSpellID(self) == SPL_IceCube) * * * * * * // или Ледяная глыба
* *{
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// очистить восприятия
* * * *B_ClearPerceptions(self);
* * * *// перевести жертву в состояние Магической заморозки
* * * *AI_StartState(self,ZS_MagicFreeze,0,"");
* *};
};

// Инициализация состояния
func void ZS_MagicBurn()
{
* *// установить восприятие прекращения действия магии
* *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopMa gicBurn);
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp(self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick(self);
* *};
};

// Функция цикла состояния
func int ZS_MagicBurn_Loop()
{ *
* *// разрешить локальное восприятие на воздействие магии
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartBur n);
* *// если прошла 1 секунда
* *if(Npc_GetStateTime(self) == 1)
* *{
* * * *// сбросить время состояния
* * * *Npc_SetStateTime(self,0);
* * * *// нанести жертве секундный урон
* * * *B_MagicHurtNpc(other,self,SPL_MAGICBURN_DAMAGE_PE R_SEC);
* *};
* *// если жизнь жертвы кончилась
* *if(self.attribute[ATR_HITPOINTS] <= 0)
* *{
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self); * *
* * * *// НПС встает
* * * *AI_StandUp(self);
* * * *return LOOP_END;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_MagicBurn_End()
{
};


ЗЫ: Каким-то странным образом включается жирный шрифт, а отменить его нельзя, раньше тоже это наблюдал, но реже и удавалось убрать переформатированием текста.
ЗЫЫЫ: Оказывается это видно только в редакторе!
Ответить с цитированием
Старый 18.04.2005, 12:09   #145
Vam

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

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

2Jeene:
Подскажи пожалуйста, нужны ли файлы в папке GII\_Work\Data\Scripts\Content\Story\Missions, помоему это всё для первой готики...
Такой папки в скриптах Готики 2 нет, она есть только в Готике 1.

И ещё, если не сложно, напиши, какие файлы в папке Scripts совершенно не нужны?
Это сделать сложно, разбираюсь по ходу уроков, папку AI почти полностью рассмотрел, рекомендации по ней в Уроках.

----------------------------------------------------------

// ************************************************** **
// Обработчик состояния Короткого магического горения
// ************************************************** **

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

const int SPL_MAGICBURNSHORT_DAMAGE_PER_SEC = 1; * *// ущерб в сек от заклинания

// Закончить действие заклинания
func void B_StopMagicBurnShort()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* * * *// продолжить распорядок дня НПС (т.к. завершение этого состояния выполняется не из цикла состояния)
* * * *AI_ContinueRoutine(self);
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* * * *// продолжить распорядок дня НПС
* * * *AI_ContinueRoutine(self);
* *};
}; *

// Функция реакции на локальное восприятие магии (заклинания)
func void B_RestartBurnShort()
{
* *// если последнее примененное заклинание
* *if (Npc_GetLastHitSpellID(self) == SPL_ChargeFireball) *// Большой огненный шар
* *¦¦ (Npc_GetLastHitSpellID(self) == SPL_Firestorm) * * * // или Малая огненная буря
* *{
* * * *// сбросить время нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self,0);
* * * *return;
* *};
* *// если последнее примененное заклинание
* *if (Npc_GetLastHitSpellID(self) == SPL_IceWave) * * * * // Ледяная волна
* *¦¦ (Npc_GetLastHitSpellID(self) == SPL_IceCube) * * * * // или Ледяная глыба
* *{
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// очистить восприятия
* * * *B_ClearPerceptions(self);
* * * *// перевести жертву в состояние Магической заморозки
* * * *AI_StartState(self,ZS_MagicFreeze,0,"");
* *};
};

// Инициализация состояния
func void ZS_MagicBurnShort()
{
* *// установить восприятие прекращения действия магии
* *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopMa gicBurnShort);
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp (self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick (self);
* *};
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// анимация горения
* * * *Npc_PlayAni(self,"S_FIRE_VICTIM");
* *};
};

// Функция цикла состояния
func int ZS_MagicBurnShort_Loop()
{ *
* *// разрешить локальное восприятие на воздействие магии
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartBur nShort);
* *// если прошла 1 секунда
* *if(Npc_GetStateTime(self) == 1)
* *{
* * * *// сбросить время состояния
* * * *Npc_SetStateTime(self,0);
* * * *// нанести жертве секундный урон
* * * *B_MagicHurtNpc(other,self,SPL_MAGICBURNSHORT_DAMA GE_PER_SEC);
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self); * *
* * * *// НПС встает
* * * *AI_StandUp(self);
* * * *return LOOP_END;
* *};
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// анимация горения
* * * *Npc_PlayAni(self,"S_FIRE_VICTIM");
* *};
* *// если жизнь жертвы кончилась
* *if(self.attribute[ATR_HITPOINTS] <= 0)
* *{
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self); * *
* * * *// НПС встает
* * * *AI_StandUp(self);
* * * *return LOOP_END;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_MagicBurnShort_End()
{
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
};

... ещё файл

// **************************************
// Обработчик состояния страха
// **************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Закончить действие заклинания
func void B_StopMagicFlee()
{
* *// запретить восприятие повреждений
* *Npc_PercDisable(self,PERC_ASSESSDAMAGE);
* *// восстановить other на агрессора
* *Npc_SetTarget(self,other);
* *// переход в состояние убегания от агрессора
* *AI_StartState(self,ZS_Flee,0,"");
}; * * *

// Инициализация состояния
func void ZS_MagicFlee ()
{
* *// если жертва Дракон
* *if(self.guild == GIL_DRAGON)
* *{
* * * *// продолжить распорядок дня НПС (нет реакции на магию)
* * * *AI_ContinueRoutine(self);
* *};
* *var int randy;
* *// установить восприятие прекращения действия магии
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_StopMagic Flee);
* *// разрешить восприятие магии
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// сбросить статус предупреждений охраны
* *self.aivar[AIV_Guardpassage_Status] = GP_NONE;
* *// сбросить счетчик отказа от диалога
* *Npc_SetRefuseTalk(self,0);
* *// установить временное отношение между жертвой и ГГ равное постоянному
* *Npc_SetTempAttitude(self,Npc_GetPermAttitude(self ,hero));
* *// НПС и ГГ перестают смотреть друг на друга
* *B_StopLookAt(self);
* *// НПС прекращает на что-либо указывать
* *AI_StopPointAt(self);
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp(self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick(self);
* *};
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *randy = Hlp_Random (3);
* * * *// проигрывается анимация
* * * *if(randy == 0) *{ AI_PlayAniBS(self,"T_STAND_2_FEAR_VICTIM1",BS_STAN D); };
* * * *if(randy == 1) *{ AI_PlayAniBS(self,"T_STAND_2_FEAR_VICTIM2",BS_STAN D); };
* * * *if(randy == 2) *{ AI_PlayAniBS(self,"T_STAND_2_FEAR_VICTIM3",BS_STAN D); };
* *};
};

// Функция цикла состояния
func int ZS_MagicFlee_Loop()
{ *
* *// если время в состоянии > времени действия заклинания
* *if(Npc_GetStateTime(self) > SPL_Time_Fear)
* *{
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// закончить действие обработчика
* * * *B_StopMagicFlee();
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_MagicFlee_End()
{
};

... ещё файл

// *******************************************
// Обработчик состояния Магической заморозки
// *******************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Функция реакции на локальное восприятие магии (заклинания)
func void B_RestartFreeze()
{
* *// если последнее примененное заклинание
* *if (Npc_GetLastHitSpellID(self) == SPL_IceCube) * * // Ледяная глыба
* *¦¦ (Npc_GetLastHitSpellID(self) == SPL_IceWave) * * // или Ледяная волна
* *{
* * * *// сбросить время нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self,0);
* *};
};

// Закончить действие заклинания
func void B_StopMagicFreeze()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* *};
};

// Инициализация состояния
func void ZS_MagicFreeze()
{
* *// разрешить локальное восприятие на воздействие магии
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartFre eze);
* *// прекратить анимацию
* *Npc_StopAni(self,"S_FIRE_VICTIM");
* *// если состояние тела НПС не прерываемо
* *if(!C_BodyStateContains(self,BS_UNCONSCIOUS))
* *{
* * * *// анимация заморозки
* * * *AI_PlayAniBS(self,"T_STAND_2_FREEZE_VICTIM",BS_UN CONSCIOUS);
* *};
* *// сброс времени заморозки
* *self.aivar[AIV_FreezeStateTime] = 0;
};

// Функция цикла состояния
func int ZS_MagicFreeze_Loop()
{ *
* *// если время в состоянии > времени действия заклинания
* *if(Npc_GetStateTime(self) > SPL_TIME_FREEZE)
* *{
* * * *// закончить действие обработчика
* * * *B_StopMagicFreeze();
* * * *return LOOP_END;
* *};
* *// если время в состоянии не равно времени заморозки
* *if(Npc_GetStateTime(self) != self.aivar[AIV_FreezeStateTime])
* *{
* * * *// время заморозки = времени состояния
* * * *self.aivar[AIV_FreezeStateTime] = Npc_GetStateTime(self);
* * * *// если жизнь жертвы > ущерба от заклинания
* * * *if(self.attribute[ATR_HITPOINTS] > (self.attribute[ATR_HITPOINTS] - SPL_FREEZE_DAMAGE))
* * * *{
* * * * * *// если жертва Огненный голем или
* * * * * *if (self.guild == GIL_FIREGOLEM)
* * * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] *== *ID_FIREWARAN) * * * // Огненная ящерица
* * * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] *== *ID_DRAGON_FIRE) * * // или Огненный дракон
* * * * * *{
* * * * * * * *// нанести удвоенное повреждение в сек
* * * * * * * *B_MagicHurtNpc(other,self,SPL_FREEZE_DAMAGE*2);
* * * * * * * *return LOOP_CONTINUE;
* * * * * *};
* * * * * *// если жертва Ледяной голем или Ледяной дракон
* * * * * *if(self.guild == GIL_ICEGOLEM) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE)
* * * * * *{
* * * * * * * *// нанести половинное порреждение в сек
* * * * * * * *B_MagicHurtNpc(other,self,SPL_FREEZE_DAMAGE/2);
* * * * * * * *return LOOP_CONTINUE;
* * * * * *};
* * * * * *// нанести обычное повреждение в сек
* * * * * *B_MagicHurtNpc(other,self,SPL_FREEZE_DAMAGE);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_MagicFreeze_End()
{
};

... ещё файл

// ***************************************
// Обработчик состояния Уменьшить монстра
// ***************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Инициализация состояния
func void ZS_MagicShrink()
{
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp(self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick(self);
* *};
* *// сброс времени уменьшения
* *self.aivar[AIV_MM_ShrinkState] = 0;
};

// Функция цикла состояния
func int ZS_MagicShrink_Loop()
{
* *// за 13 секунд плавно уменьшить жертву
* *if * * (self.aivar[AIV_MM_ShrinkState] == 0) * *{ Mdl_SetModelScale(self,0.90,0.90,0.90); self.aivar[AIV_MM_ShrinkState] = 1; }
* *else if(self.aivar[AIV_MM_ShrinkState] == 1) * *{ Mdl_SetModelScale(self,0.85,0.85,0.85); self.aivar[AIV_MM_ShrinkState] = 2; }
* *else if(self.aivar[AIV_MM_ShrinkState] == 2) * *{ Mdl_SetModelScale(self,0.80,0.80,0.80); self.aivar[AIV_MM_ShrinkState] = 3; }
* *else if(self.aivar[AIV_MM_ShrinkState] == 3) * *{ Mdl_SetModelScale(self,0.75,0.75,0.75); self.aivar[AIV_MM_ShrinkState] = 4; }
* *else if(self.aivar[AIV_MM_ShrinkState] == 4) * *{ Mdl_SetModelScale(self,0.70,0.70,0.70); self.aivar[AIV_MM_ShrinkState] = 5; }
* *else if(self.aivar[AIV_MM_ShrinkState] == 5) * *{ Mdl_SetModelScale(self,0.65,0.65,0.65); self.aivar[AIV_MM_ShrinkState] = 6; }
* *else if(self.aivar[AIV_MM_ShrinkState] == 6) * *{ Mdl_SetModelScale(self,0.60,0.60,0.60); self.aivar[AIV_MM_ShrinkState] = 7; }
* *else if(self.aivar[AIV_MM_ShrinkState] == 7) * *{ Mdl_SetModelScale(self,0.55,0.55,0.55); self.aivar[AIV_MM_ShrinkState] = 8; }
* *else if(self.aivar[AIV_MM_ShrinkState] == 8 ) * *{ Mdl_SetModelScale(self,0.50,0.50,0.50); self.aivar[AIV_MM_ShrinkState] = 9; }
* *else if(self.aivar[AIV_MM_ShrinkState] == 9) * *{ Mdl_SetModelScale(self,0.45,0.45,0.45); self.aivar[AIV_MM_ShrinkState] = 10;}
* *else if(self.aivar[AIV_MM_ShrinkState] == 10) * { Mdl_SetModelScale(self,0.40,0.40,0.40); self.aivar[AIV_MM_ShrinkState] = 11;}
* *else if(self.aivar[AIV_MM_ShrinkState] == 11) * { Mdl_SetModelScale(self,0.35,0.35,0.35); self.aivar[AIV_MM_ShrinkState] = 12;}
* *else if(self.aivar[AIV_MM_ShrinkState] == 12) * { Mdl_SetModelScale(self,0.30,0.30,0.30); self.aivar[AIV_MM_ShrinkState] = 13;}
* *// если жертва уменьшена
* *else if (self.aivar[AIV_MM_ShrinkState] == 13) *
* *{
* * * *// уменьшить жизнь жертвы
* * * *Npc_ChangeAttribute(self,ATR_HITPOINTS,-((self.attribute[ATR_HITPOINTS]*9)
/10));
* * * *// уменьшить макс. жизнь жертвы
* * * *Npc_ChangeAttribute(self,ATR_HITPOINTS_MAX,-((self.attribute[ATR_HITPOINTS_MAX]*9)/10));
* * * *// уменьшить силу жертвы
* * * *Npc_ChangeAttribute(self,ATR_STRENGTH,-((self.attribute[ATR_STRENGTH]*9)/1
0));
* * * *// уменьшить защиту от тупого оружия
* * * *self.protection[PROT_BLUNT] = self.protection[PROT_BLUNT]/10; * * *
* * * *// уменьшить защиту от острого оружия
* * * *self.protection[PROT_EDGE] = self.protection[PROT_EDGE]/10;
* * * *// уменьшить защиту от огня
* * * *self.protection[PROT_FIRE] = self.protection[PROT_FIRE]/10;
* * * *// защита от нокаута = 0
* * * *self.protection[PROT_FLY] = 0; *
* * * *// уменьшить защиту от магии
* * * *self.protection[PROT_MAGIC] = self.protection[PROT_MAGIC]/10;
* * * *// уменьшить защиту от тотечного оружия
* * * *self.protection[PROT_POINT] = self.protection[PROT_POINT]/10;
* * * *// переход на следующую фазу состояния
* * * *self.aivar[AIV_MM_ShrinkState] = 14;
* *}
* *// если достигнута последняя фаза состояния
* *else if(self.aivar[AIV_MM_ShrinkState] == 14)
* *{
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// установить обработчик поведения в уменьшенном состоянии
* * * *self.start_aistate = ZS_MagicShrunk;
* * * *// переход в новый обработчик
* * * *AI_StartState(self,ZS_MagicShrunk,1,"");
* * * *return LOOP_END;
* *};
* *// задержка перед последней фазой состояния
* *AI_Wait(self,0.38 );
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_MagicShrink_End()
{
};

// ********************************************
// Обработчик поведения уменьшенного монстра
// ********************************************

// Инициализация состояния
func void ZS_MagicShrunk()
{ *
* *// установить целью ГГ
* *Npc_SetTarget(self,hero);
};

// Функция цикла состояния
func int ZS_MagicShrunk_Loop()
{
* *// монстр убегает от ГГ
* *AI_Flee(self);
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_MagicShrunk_End()
{ *
};

Ответить с цитированием
Старый 19.04.2005, 12:50   #146
Vam

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

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

// **************************************
// Обработчик состояния Магический сон
// **************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Локальное восприятие повреждения (окончание действия заклинания)
func int B_StopMagicSleep()
{
* *// запретить восприятие повреждений
* *Npc_PercDisable(self,PERC_ASSESSDAMAGE);
* *// жертва говорит агрессору (SVM фраза) "(сам с собою, просыпаясь) Что это было!?" (Примечание: Ошибка слово $WHATWASSTHAT надо заменить на $WHATWASTHAT, а то фраза не будет сказана)
* *B_Say_Overlay(self,other,"$WHATWASSTHAT");
* *// анимация перехода в нормальное состояние
* *AI_PlayAni(self,"T_VICTIM_SLE_2_STAND");
}; * * *

// Локальное восприятие разговора
func void B_AssessMagicSleepTalk()
{
* *// жертва говорит агрессору (SVM фраза) "(просыпаясь) Черт, что случилось?"
* *B_Say(self,other,"$YOUDISTURBEDMYSLUMBER");
* *// жертва переходит в состояние наблюдения за ГГ
* *AI_StartState(self,ZS_ObservePlayer,1,"");
};

// Инициализация состояния
func void ZS_MagicSleep()
{
* *// установить локальное восприятие повреждения
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_StopMagic Sleep);
* *// разрешить восприятие магии
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// установить локальное восприятие разговора
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessMagic SleepTalk);
* *// Сбросить статус предупреждений охраной
* *self.aivar[AIV_Guardpassage_Status] = GP_NONE;
* *// сбросить счетчик отказа от диалога
* *Npc_SetRefuseTalk(self,0);
* *// установить временное отношение между жертвой и ГГ равное постоянному
* *Npc_SetTempAttitude(self,Npc_GetPermAttitude(self ,hero));
* *// НПС и ГГ перестают смотреть друг на друга
* *B_StopLookAt(self);
* *// НПС прекращает на что-либо указывать
* *AI_StopPointAt(self);
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp(self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick(self);
* *};
* *// проигрывается анимация перехода в Магический сон
* *AI_PlayAniBS(self,"T_STAND_2_VICTIM_SLE",BS_LIE );
};

// Функция цикла состояния
func int ZS_MagicSleep_Loop()
{ *
* *// если время в состоянии > времени действия заклинания
* *if(Npc_GetStateTime(self) > SPL_Time_Sleep)
* *{
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// закончить действие обработчика
* * * *B_StopMagicSleep();
* * * *return LOOP_END;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_MagicSleep_End()
{
};

... ещё файл

// ************************************************** *********
// Обработчик состояния Большой огненной бури
// -----------------------------------------------------------
// В это состояние НПС переводится экзешником, а не скриптами
// ************************************************** *********

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Закончить действие заклинания
func void B_StopPyro()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* * * *// продолжить распорядок дня НПС (т.к. не было принудительного перевода НПС в это состояние из скриптов и завершение этого состояния выполняется не из цикла состояния)
* * * *AI_ContinueRoutine(self);
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* * * *// продолжить распорядок дня НПС
* * * *AI_ContinueRoutine(self);
* *};
}; *

// Инициализация состояния
func void ZS_Pyro()
{
* *// установить восприятие прекращения действия магии
* *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopPy ro);
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self, BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp(self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick(self);
* *};
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// проиграть анимацию входа в состояние
* * * *AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM");
* *}; *
};

// Функция цикла состояния
func int ZS_Pyro_Loop()
{ *
* *// если прошла 1 секунда
* *if(Npc_GetStateTime(self) >= 1)
* *{
* * * *// сбросить время состояния
* * * *Npc_SetStateTime(self,0);
* * * *// нанести жертве секундный урон
* * * *B_MagicHurtNpc(other,self,SPL_PYRO_DAMAGE_PER_SEC );
* * * *// если жизнь жертвы кончилась
* * * *if(self.attribute[ATR_HITPOINTS] <= 0)
* * * *{
* * * * * *// очистить очередь AI состояний НПС
* * * * * *Npc_ClearAIQueue(self); * *
* * * * * *// НПС встает
* * * * * *AI_StandUp(self);
* * * * * *return LOOP_END;
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Pyro_End()
{
};

... ещё файл

// ************************************************
// Обработчик состояния реакции на Шаровую молнию
// ************************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Закончить действие заклинания
func void B_StopShortZapped()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* * * *// продолжить распорядок дня НПС (т.к. завершение этого состояния выполняется не из цикла состояния)
* * * *AI_ContinueRoutine(self);
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* * * *// продолжить распорядок дня НПС
* * * *AI_ContinueRoutine(self);
* *};
}; * * *

// Инициализация состояния
func void ZS_ShortZapped()
{
* *// установить восприятие прекращения действия магии
* *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopSh ortZapped);
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp(self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick(self);
* *};
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// проиграть анимацию входа в состояние
* * * *AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM");
* *}; *
};

// Функция цикла состояния
func int ZS_ShortZapped_Loop()
{ *
* *// если время в состоянии > времени действия заклинания
* *if(Npc_GetStateTime(self) > SPL_TIME_SHORTZAPPED) *
* *{
* * * *// закончить действие обработчика
* * * *B_StopShortZapped();
* * * *return LOOP_END;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_ShortZapped_End()
{
};

... ещё файл

// *************************************
// Обработчик состояния Украсть энергию
// *************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

var int Temp_SuckEnergy_DistToPlayer; * // расстояние между жертвой и ГГ

// Функция реакции на локальное восприятие магии (заклинания)
func void B_RestartSuckEnergy()
{
* *// если последнее примененное заклинание Украсть энергию
* *if(Npc_GetLastHitSpellID(self) == SPL_SuckEnergy)
* *{
* * * *// сбросить время нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self,0);
* * * *// анимация состояния
* * * *AI_PlayAni(self,"T_STAND_2_SUCKENERGY_VICTIM");
* *};
};

// Закончить действие заклинания
func void B_StopSuckEnergy()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* *};
};

// Инициализация состояния
func void ZS_SuckEnergy()
{
* *// установить локальное восприятие на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartSuc kEnergy);
* *// остановить проигрывание файла анимации заклинания
* *Npc_StopAni(self, "S_SUCKENERGY_VICTIM"); *
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// сброс времени цикла
* *self.aivar[AIV_SuckEnergyStateTime] = 1;
* *// запомнить расстояние между жертвой и ГГ
* *Temp_SuckEnergy_DistToPlayer = Npc_GetDistToPlayer(self);
};

// Функция цикла состояния
func int ZS_SuckEnergy_Loop()
{ *
* *// если время в состоянии > времени действия заклинания или расстояние между ГГ и жертвой увеличилось на более 10м
* *if(Npc_GetStateTime(self) > SPL_TIME_SuckEnergy) ¦¦ (Temp_SuckEnergy_DistToPlayer >= Npc_GetDistToPlayer(self) + 100)
* *{
* * * *// остановить действие заклинания
* * * *B_StopSuckEnergy();
* * * *return LOOP_END;
* *};
* *// если текущее время состояния не равно времени цикла
* *if(Npc_GetStateTime(self) != self.aivar[AIV_SuckEnergyStateTime])
* *{
* * * *// если первая фаза состояния
* * * *if(Npc_GetStateTime(self) == 0) *
* * * *{
* * * * * *// если состояние тела НПС не прерываемо
* * * * * *if(!C_BodyStateContains(self, BS_UNCONSCIOUS))
* * * * * *{
* * * * * * * *// анимация перехода в бессознательное состояние
* * * * * * * *AI_PlayAniBS(self,"T_STAND_2_SUCKENERGY_VICTIM",B S_UNCONSCIOUS);
* * * * * *};
* * * * * *// эффект высасывания энергии
* * * * * *Wld_PlayEffect("spellFX_SuckEnergy_BloodFly",self ,hero,0,0,0,FAL
SE);
* * * *};
* * * *// обновить время цикла
* * * *self.aivar[AIV_SuckEnergyStateTime] = Npc_GetStateTime(self);
* * * *// если жизнь жертвы > ущерба от заклинания
* * * *if(self.attribute[ATR_HITPOINTS] > SPL_SuckEnergy_DAMAGE)
* * * *{
* * * * * *// нанести жертве урон
* * * * * *B_MagicHurtNpc(other,self,SPL_SuckEnergy_DAMAGE);
* * * * * *// добавить украденную жизнь агрессору
* * * * * *Npc_ChangeAttribute(other,ATR_HITPOINTS,SPL_SuckE nergy_DAMAGE);
* * * *}
* * * *else
* * * *{
* * * * * *// убить жертву
* * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_SuckEnergy_End()
{
};

Ответить с цитированием
Старый 20.04.2005, 09:06   #147
Vam

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

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

// *************************************
// Обработчик состояния заклинания Рой
// *************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Функция реакции на локальное восприятие магии
func void B_RestartSwarm()
{
* *// если последнее примененное заклинание Рой
* *if(Npc_GetLastHitSpellID(self) == SPL_Swarm)
* *{
* * * *// сбросить время нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self,0);
* *};
};

// Закончить действие заклинания
func void B_StopSwarm()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if (self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* *};
};

// Инициализация состояния
func void ZS_Swarm()
{
* *// установить локальное восприятие на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartSwa rm);
* *// остановить проигрывание файла анимации заклинания
* *Npc_StopAni(self,"S_SWARM_VICTIM");
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если состояние тела НПС не прерываемо
* *if(!C_BodyStateContains(self,BS_UNCONSCIOUS))
* *{
* * * *// анимация перехода в бессознательное состояние
* * * *AI_PlayAniBS(self,"T_STAND_2_SWARM_VICTIM",BS_UNC ONSCIOUS);
* *};
* *// сброс времени цикла
* *self.aivar[AIV_SwarmStateTime] = 0;
};

// Функция цикла состояния
func int ZS_Swarm_Loop ()
{ *
* *// если время в состоянии > времени действия заклинания
* *if(Npc_GetStateTime(self) > SPL_TIME_Swarm)
* *{
* * * *// остановить действие заклинания
* * * *B_StopSwarm();
* * * *return LOOP_END;
* *};
* *// если прошла 1 сек
* *if(Npc_GetStateTime(self) != self.aivar[AIV_SwarmStateTime])
* *{
* * * *// если жертва находится в состоянии 2 сек
* * * *if(Npc_GetStateTime(self) == 2)
* * * *{ *
* * * * * *// жертва говорит агрессору (SVM фраза) "Ах, черт!"
* * * * * *B_Say(self,other,"$RunAway");
* * * *}
* * * *// через 6 сек
* * * *else if(Npc_GetStateTime(self) == 6)
* * * *{
* * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"
* * * * * *B_Say(self,other,"$Aargh_2");
* * * *}
* * * *// через 7 сек
* * * *else if(Npc_GetStateTime(self) == 7)
* * * *{
* * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"
* * * * * *B_Say (self,other,"$Aargh_3");
* * * *}
* * * *// через 8 сек
* * * *else if(Npc_GetStateTime(self) == 8 )
* * * *{
* * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"
* * * * * *B_Say(self,other,"$Aargh_1");
* * * *};
* * * *// установить счетчик цикла на текущее время
* * * *self.aivar[AIV_SwarmStateTime] = Npc_GetStateTime(self);
* * * *// если жизнь жертвы > ущерба от заклинания
* * * *if(self.attribute[ATR_HITPOINTS] > SPL_Swarm_DAMAGE)
* * * *{
* * * * * *// нанести жертве урон
* * * * * *B_MagicHurtNpc(other,self,SPL_Swarm_DAMAGE);
* * * *}
* * * *else
* * * *{
* * * * * *// убить жертву
* * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Swarm_End()
{
};

... ещё файл

// ******************************************
// Обработчик состояния заклинания Смерч
// ******************************************

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Функция реакции на локальное восприятие магии
func void B_RestartWhirlwind()
{
* *// если последнее примененное заклинание Смерч
* *if(Npc_GetLastHitSpellID(self) == SPL_Whirlwind)
* *{
* * * *// сбросить время нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self,0);
* *};
};

// Закончить действие заклинания
func void B_StopWhirlwind()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* *};
};

// Инициализация состояния
func void ZS_Whirlwind()
{
* *// установить локальное восприятие на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartWhi rlwind);
* *// остановить проигрывание файла анимации заклинания
* *Npc_StopAni(self,"S_WHIRLWIND_VICTIM");
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если состояние тела НПС не прерываемо
* *if(!C_BodyStateContains(self, BS_UNCONSCIOUS))
* *{
* * * *// анимация перехода в бессознательное состояние
* * * *AI_PlayAniBS(self,"T_STAND_2_WHIRLWIND_VICTIM",BS _UNCONSCIOUS);
* *};
* *// сброс счетчика цикла
* *self.aivar[AIV_WhirlwindStateTime] = 0;
};

// Функция цикла состояния
func int ZS_Whirlwind_Loop ()
{ *
* *// если время в состоянии > времени действия заклинания
* *if(Npc_GetStateTime(self) > SPL_TIME_WHIRLWIND)
* *{
* * * *// остановить действие заклинания
* * * *B_StopWhirlwind();
* * * *return LOOP_END;
* *};
* *// если прошла 1 сек
* *if(Npc_GetStateTime(self) != self.aivar[AIV_WhirlwindStateTime])
* *{
* * * *// установить счетчик цикла на текущее время
* * * *self.aivar[AIV_WhirlwindStateTime] = Npc_GetStateTime(self);
* * * *// если жизнь жертвы > ущерба от заклинания
* * * *if(self.attribute[ATR_HITPOINTS] > SPL_Whirlwind_DAMAGE)
* * * *{
* * * * * *// нанести жертве урон
* * * * * *B_MagicHurtNpc(other,self,SPL_Whirlwind_DAMAGE);
* * * *}
* * * *else
* * * *{
* * * * * *// убить жертву
* * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Whirlwind_End()
{
};

... ещё файл

// ************************************************** *********
// Обработчик состояния Удар молнии
// -----------------------------------------------------------
// В это состояние НПС переводится экзешником, а не скриптами
// ************************************************** *********

// ----------------------------------------------------
// self - жертва заклинания
// other - кастующий НПС (агрессор)
// ----------------------------------------------------

// Закончить действие заклинания
func void B_StopZapped()
{ *
* *// возвратить общую функцию состояния реакции на магию
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// очистить очередь AI состояний НПС
* *Npc_ClearAIQueue(self);
* *// НПС встает
* *AI_StandUp(self);
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// реакция НПС на повреждение
* * * *B_AssessDamage();
* * * *// продолжить распорядок дня НПС (т.к. не было принудительного перевода НПС в это состояние из скриптов и завершение этого состояния выполняется не из цикла состояния)
* * * *AI_ContinueRoutine(self);
* *}
* *else
* *{
* * * *// установить временно враждебное отношение НПС к ГГ
* * * *Npc_SetTempAttitude(self,ATT_HOSTILE);
* * * *// продолжить распорядок дня НПС
* * * *AI_ContinueRoutine(self);
* *};
};

// Инициализация состояния
func void ZS_Zapped()
{
* *// установить восприятие прекращения действия магии
* *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopZa pped);
* *// если состояние тела НПС не прерываемо
* *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))
* *{
* * * *// НПС встает
* * * *AI_StandUp(self);
* *}
* *else
* *{
* * * *// НПС быстро встает
* * * *AI_StandUpQuick(self);
* *};
* *// если жертва человек
* *if(self.guild < GIL_SEPERATOR_HUM)
* *{
* * * *// включить анимацию действия заклинания
* * * *AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM");
* *}; *
};

// Функция цикла состояния
func int ZS_Zapped_Loop()
{ *
* *// если прошла 1 секунда
* *if(Npc_GetStateTime(self) >= 1)
* *{
* * * *// сбросить время состояния
* * * *Npc_SetStateTime(self,0);
* * * *// нанести жертве секундный урон
* * * *B_MagicHurtNpc(other,self,SPL_ZAPPED_DAMAGE_PER_S EC);
* * * *// если жизнь жертвы кончилась
* * * *if(self.attribute[ATR_HITPOINTS] <= 0)
* * * *{
* * * * * *// очистить очередь AI состояний НПС
* * * * * *Npc_ClearAIQueue(self); * *
* * * * * *// НПС встает
* * * * * *AI_StandUp(self);
* * * * * *return LOOP_END;
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Zapped_End()
{
};

Ответить с цитированием
Старый 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;
};

Ответить с цитированием
Старый 22.04.2005, 09:15   #149
Vam

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

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

C_ функции монстров расположены в директории ..\AI\Monsrer\C_Monster

// ************************************************** ******************
// Является ли монстр магом
// ************************************************** ******************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый монстр
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_NpcIsMonsterMage(var C_NPC slf)
{
* *// если монстр Маг скелетов или
* *if (slf.guild == GIL_SKELETON_MAGE)
* *¦¦ (slf.guild == GIL_FIREGOLEM) * * // Огненный голем
* *¦¦ (slf.guild == GIL_ICEGOLEM) * * *// или Ледяной голем
* *¦¦ (slf.guild == GIL_DRAGON) * * * *// или Дракон
* *{
* * * *return TRUE;
* *};
* *return FALSE;
};

... ещё файл

// ************************************************** ******************************
*****
// Устраивает ли монстра добыча в виде жертвы (на кого охотяться монстры)
// ************************************************** ******************************
*****

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый монстр (охотник)
// oth - НПС добыча
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_PredatorFoundPrey(var C_NPC slf,var C_NPC oth)
{
* *// если охотник волк, но не кабан
* *if(slf.guild == GIL_WOLF) && (slf.aivar[AIV_MM_REAL_ID] != ID_Keiler)
* *{
* * * *// если добыча овца
* * * *if(oth.guild == GIL_SHEEP) * * *{ return TRUE; };
* * * *// если добыча крыса
* * * *if(oth.guild == GIL_GIANT_RAT) *{ return TRUE; };
* * * *// если добыча кротокрыс
* * * *if(oth.guild == GIL_MOLERAT) * *{ return TRUE; };
* * * *// если добыча падальщик, но не зубастик
* * * *if(oth.guild == GIL_SCAVENGER) && (oth.aivar[AIV_MM_REAL_ID] != ID_ORCBITER) * *{ return TRUE; };
* *};
* *// если охотник шныг
* *if(slf.guild == GIL_LURKER) * * * *
* *{
* * * *// если добыча гоблин
* * * *if (oth.guild == GIL_GOBBO) * * { return TRUE; };
* *};
* *// если охотник глорх
* *if(slf.guild == GIL_SNAPPER)
* *{
* * * *// если добыча человек
* * * *if(oth.guild < GIL_SEPERATOR_HUM) * { return TRUE; };
* * * *// если добыча гоблин
* * * *if(oth.guild == GIL_GOBBO) * * * * *{ return TRUE; };
* * * *// если добыча овца
* * * *if(oth.guild == GIL_SHEEP) * * * * *{ return TRUE; };
* * * *// если добыча крыса
* * * *if(oth.guild == GIL_GIANT_RAT) * * *{ return TRUE; };
* * * *// если добыча кротокрыс
* * * *if(oth.guild == GIL_MOLERAT) * * * *{ return TRUE; };
* * * *// если добыча падальщик, но не зубастик
* * * *if(oth.guild == GIL_SCAVENGER) && (oth.aivar[AIV_MM_REAL_ID] != ID_ORCBITER) * *{ return TRUE; };
* *};
* *// если охотник мракорис
* *if(slf.guild == GIL_SHADOWBEAST) * * * * * *
* *{
* * * *// если добыча человек
* * * *if(oth.guild < GIL_SEPERATOR_HUM) * { return TRUE; };
* * * *// если добыча орк
* * * *if(oth.guild > GIL_SEPERATOR_ORC) * { return TRUE; };
* * * *// если добыча овца
* * * *if(oth.guild == GIL_SHEEP) * * * * *{ return TRUE; };
* * * *// если добыча крыса
* * * *if(oth.guild == GIL_GIANT_RAT) * * *{ return TRUE; };
* * * *// если добыча кротокрыс
* * * *if(oth.guild == GIL_MOLERAT) * * * *{ return TRUE; };
* * * *// если добыча падальщик, но не зубастик
* * * *if(oth.guild == GIL_SCAVENGER) && (oth.aivar[AIV_MM_REAL_ID] != ID_ORCBITER) * *{ return TRUE; };
* *};
* *return FALSE;
};

... ещё файл

// ***********************************
// Пожирает ли монстр труп добычи
// ***********************************

// ================================================== ==================
// Аргументы:
// --------------------------------------------------------------------
// slf - проверяемый монстр (охотник)
// oth - НПС добыча (труп)
// --------------------------------------------------------------------
// Возвращаемое значение:
// TRUE - да, FALSE - нет.
// ================================================== ==================

func int C_WantToEat(var C_NPC slf,var C_NPC oth)
{
* *// если монстр член партии ГГ
* *if(slf.aivar[AIV_PARTYMEMBER] == TRUE)
* *{
* * * *return FALSE;
* *};
* *// если охотник падальщик
* *if(slf.guild == GIL_SCAVENGER)
* *{
* * * *// если труп человек или орк
* * * *if(oth.guild < GIL_SEPERATOR_HUM) * * * { * return TRUE; * *};
* * * *if(oth.guild > GIL_SEPERATOR_ORC) * * * { * return TRUE; * *};
* * * *// если труп овца или полевые хищники
* * * *if(oth.guild == GIL_SHEEP) * * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_GIANT_RAT) * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_MOLERAT) * * * * * *{ * return TRUE; * *};
* * * *// если труп гарпия
* * * *if(oth.guild == GIL_HARPY) * * * * * * *{ * return TRUE; * *};
* * * *// если труп волки
* * * *if(oth.guild == GIL_WOLF) * * * * * * * { * return TRUE; * *};
* * * *if(oth.guild == GIL_SUMMONED_WOLF) * * *{ * return TRUE; * *};
* * * *// если труп мракорис
* * * *if(oth.guild == GIL_SHADOWBEAST) * * * *{ * return TRUE; * *};
* * * *// если труп рептилий
* * * *if(oth.guild == GIL_GOBBO) * * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_WARAN) * * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_LURKER) * * * * * * { * return TRUE; * *};
* * * *if(oth.guild == GIL_SNAPPER) * * * * * *{ * return TRUE; * *};
* * * *// в принципе здесь все понятно и без комментариев
* * * *if(oth.guild == GIL_MEATBUG) * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_GIANT_BUG) * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_BLOODFLY) * * * * * { * return TRUE; * *};
* * * *if(oth.guild == GIL_MINECRAWLER) * * * *{ * return TRUE; * *};
* *};
* *// если охотник крыса
* *if(slf.guild == GIL_GIANT_RAT)
* *{
* * * *if(oth.guild < GIL_SEPERATOR_HUM) * * * { * return TRUE; * *};
* * * *if(oth.guild > GIL_SEPERATOR_ORC) * * * { * return TRUE; * *};
* * * *if(oth.guild == GIL_SHEEP) * * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_GIANT_RAT) * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_MOLERAT) * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_SCAVENGER) * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_HARPY) * * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_WOLF) * * * * * * * { * return TRUE; * *};
* * * *if(oth.guild == GIL_SUMMONED_WOLF) * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_SHADOWBEAST) * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_GOBBO) * * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_WARAN) * * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_LURKER) * * * * * * { * return TRUE; * *};
* * * *if(oth.guild == GIL_SNAPPER) * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_MEATBUG) * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_GIANT_BUG) * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_BLOODFLY) * * * * * { * return TRUE; * *};
* * * *if(oth.guild == GIL_MINECRAWLER) * * * *{ * return TRUE; * *};
* *};
* *// если охотник полевой жук
* *if(slf.guild == GIL_GIANT_BUG)
* *{
* * * *if(oth.guild == GIL_MEATBUG) * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_BLOODFLY) * * * * * { * return TRUE; * *};
* * * *if(oth.guild == GIL_MINECRAWLER) * * * *{ * return TRUE; * *};
* *};
* *// если охотник ящерица
* *if(slf.guild == GIL_WARAN)
* *{
* * * *if(oth.guild == GIL_SCAVENGER) * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_HARPY) * * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_GOBBO) * * * * * * *{ * return TRUE; * *};
* *};
* *// если охотник волк, но не кабан
* *if(slf.guild == GIL_WOLF) && (slf.aivar[AIV_MM_REAL_ID] != ID_Keiler)
* *{
* * * *if(oth.guild < GIL_SEPERATOR_HUM) * * * { * return TRUE; * *};
* * * *if(oth.guild == GIL_SHEEP) * * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_GIANT_RAT) * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_MOLERAT) * * * * * *{ * return TRUE; * *};
* *};
* *// если охотник вызванный волк
* *if(slf.guild == GIL_SUMMONED_WOLF)
* *{
* * * *if(oth.guild == GIL_SHEEP) * * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_GIANT_RAT) * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_MOLERAT) * * * * * *{ * return TRUE; * *};
* *};
* *// если охотник ползун
* *if(slf.guild == GIL_MINECRAWLER)
* *{
* * * *if(oth.guild < GIL_SEPERATOR_HUM) * * * { * return TRUE; * *};
* * * *if(oth.guild > GIL_SEPERATOR_ORC) * * * { * return TRUE; * *};
* * * *if(oth.guild == GIL_MEATBUG) * * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_GIANT_BUG) * * * * *{ * return TRUE; * *};
* * * *if(oth.guild == GIL_BLOODFLY) * * * * * { * return TRUE; * *};
* *};
* *// если охотник шныг
* *if(slf.guild == GIL_LURKER)
* *{
* * * *if (oth.guild < GIL_SEPERATOR_HUM) * * *{ * return TRUE; * *};
* * * *if (oth.guild > GIL_SEPERATOR_ORC) * * *{ * return TRUE; * *};
* * * *if (oth.guild == GIL_GOBBO) * * * * * * { * return TRUE; * *};
* *};
* *// если охотник зомби
* *if (slf.guild == GIL_ZOMBIE)
* *{
* * * *if (oth.guild < GIL_SEPERATOR_HUM) * * *{ * return TRUE; * *};
* * * *if (oth.guild > GIL_SEPERATOR_ORC) * * *{ * return TRUE; * *};
* *};
* *// если охотник глорх
* *if (slf.guild == GIL_SNAPPER)
* *{
* * * *if (oth.guild < GIL_SEPERATOR_HUM) * * *{ * return TRUE; * *};
* * * *if (oth.guild > GIL_SEPERATOR_ORC) * * *{ * return TRUE; * *};
* * * *if (oth.guild == GIL_SHEEP) * * * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_GIANT_RAT) * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_MOLERAT) * * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_SCAVENGER) * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_HARPY) * * * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_WOLF) * * * * * * *{ * return TRUE; * *};
* * * *if (oth.guild == GIL_SUMMONED_WOLF) * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_SHADOWBEAST) * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_GOBBO) * * * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_WARAN) * * * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_LURKER) * * * * * *{ * return TRUE; * *};
* *};
* *// если охотник мракорис
* *if (slf.guild == GIL_SHADOWBEAST)
* *{
* * * *if (oth.guild < GIL_SEPERATOR_HUM) * * *{ * return TRUE; * *};
* * * *if (oth.guild > GIL_SEPERATOR_ORC) * * *{ * return TRUE; * *};
* * * *if (oth.guild == GIL_SHEEP) * * * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_GIANT_RAT) * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_MOLERAT) * * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_SCAVENGER) * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_HARPY) * * * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_WOLF) * * * * * * *{ * return TRUE; * *};
* * * *if (oth.guild == GIL_SUMMONED_WOLF) * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_GOBBO) * * * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_WARAN) * * * * * * { * return TRUE; * *};
* * * *if (oth.guild == GIL_LURKER) * * * * * *{ * return TRUE; * *};
* * * *if (oth.guild == GIL_SNAPPER) * * * * * { * return TRUE; * *};
* *};
* *return FALSE;
};

Ответить с цитированием
Старый 23.04.2005, 10:35   #150
Vam

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

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

19. Обработчики состояний функций распорядка дня для людей.

Все обработчики расположены в директории ..\AI\Human\TA_Human

// ******************************************
// Объявления Герольда
// ------------------------------------------
// self - герольд, hero - ГГ
// ******************************************

// Функция инициализации состояния
func void ZS_Announce_Herold()
{ *
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// разрешить восприятие тихих звуков (шаги, звон падающего предмета)
* *Npc_PercDisable(self,PERC_ASSESSQUIETSOUND);
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK); * * *
* *// движение на свой вайпоинт
* *AI_GotoWP(self,self.wp);
* *// выравнивание на вайпоинте
* *AI_AlignToWP(self);
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Announce_Herold_loop()
{
* *// если время цикла > 70 сек и ГГ ни с кем не разговаривает
* *if(Npc_GetStateTime(self) >= 70) && (hero.aivar[AIV_INVINCIBLE] == FALSE)
* *{
* * * *// анимация перехода в состояние чтения
* * * *AI_PlayAni(self,"T_HGUARD_2_STAND");
* * * *// сброс флага
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *// зачитывание приказов
* * * *B_Announce_Herold();
* * * *// сброс времени цикла
* * * *Npc_SetStateTime(self, 0);
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// анимация перехода в обычное состояние
* * * *AI_PlayAni (self,"T_STAND_2_HGUARD");
* * * *// установка флага
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *}; *
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Announce_Herold_end()
{
}; *

... ещё файл

// ***************************************
// Обработчик поведения бандита
// ***************************************

// Функция инициализации состояния
func void ZS_Bandit()
{ *
* *// установить нормальный набор восприятий
* *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);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Bandit_loop()
{
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// если бандит не у костра и костер имеется (Примечание: "костер" это ближайший свободный фрипоинт с именем FP_CAMPFIRE_xx, в дальнейшем буду использовать только сокращенное описание)
* * * *if(!Npc_IsOnFP(self,"CAMPFIRE")) && (Wld_IsFPAvailable(self,"CAMPFIRE"))
* * * *{
* * * * * *// бандит идет к костру
* * * * * *AI_GotoFP(self,"CAMPFIRE");
* * * * * *// выравнивается
* * * * * *AI_AlignToFP(self);
* * * * * *// садится
* * * * * *AI_PlayAniBS(self,"T_STAND_2_SIT",BS_SIT);
* * * *}
* * * *// если бандит не на своем месте и место имеется (свободно)
* * * *else if(!Npc_IsOnFP(self,"STAND")) && (Wld_IsFPAvailable(self,"STAND"))
* * * *{
* * * * * *// бандит идет к месту
* * * * * *AI_GotoFP(self,"STAND");
* * * * * *// выравнивается
* * * * * *AI_AlignToFP(self);
* * * * * *// охраняет
* * * * * *AI_PlayAni(self,"T_STAND_2_HGUARD");
* * * *}
* * * *else // иначе
* * * *{
* * * * * *// выравнивается
* * * * * *AI_AlignToWP(self);
* * * * * *// охраняет
* * * * * *AI_PlayAni(self,"T_STAND_2_HGUARD");
* * * *};
* * * *// установка флага
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *}; * * *
* *// если прошло 5 сек и флаг установлен и бандит не сидит
* *if(Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS) && (!C_BodyStateContains(self,BS_SIT))
* *{
* * * *var int random;
* * * *random = Hlp_Random(3);
* * * *// с вероятностью 0.33
* * * *if(random == 0)
* * * *{
* * * * * *// анимация осмотра
* * * * * *AI_PlayAni(self,"T_HGUARD_LOOKAROUND");
* * * *};
* * * *// сброс времени цикла
* * * *Npc_SetStateTime (self, 0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Bandit_end()
{
* *// если бандит сидит
* *if(C_BodyStateContains(self,BS_SIT))
* *{
* * * *// встает
* * * *AI_PlayAniBS(self,"T_SIT_2_STAND",BS_STAND);
* *}
* *else // иначе
* *{
* * * *// просто стоит
* * * *AI_PlayAni(self,"T_HGUARD_2_STAND");
* *};
};

... ещё файл

// ************************************
// Обработчик ритуала в Круге солнца
// ************************************

// Функция инициализации состояния
func void ZS_Circle() *
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить время реакции на восприятия 0.3 сек
* *Npc_SetPercTime(self,0.3);
* *// НПС встает
* *AI_StandUp(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// движение в Круг солнца
* *AI_GotoWP(self,self.wp);
* *// выравнивание
* *AI_AlignToWP(self);
};

// Функция цикла состояния
func int ZS_Circle_Loop ()
{
* *var int randy;
* *var int randyKDW;
* *var int randyKDW_Lightstar;
* *// если НПС черный маг
* *if(self.guild == GIL_DMT)
* *{
* * * *randy = Hlp_Random(3000);
* * * *// случайное время
* * * *if(Npc_GetStateTime(self) > randy)
* * * *{
* * * * * *// анимация "Дрожь земли"
* * * * * *Wld_PlayEffect("FX_EarthQuake",self,self,0,0,0,FA LSE);
* * * * * *// сброс времени цикла
* * * * * *Npc_SetStateTime(self,0);
* * * * * *// анимация красного экрана
* * * * * *Wld_PlayEffect("spellFX_INCOVATION_RED",self,self ,0,0,0,FALSE);
* * * * * *// упражнение в магии
* * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC5"); * *
* * * *}; *
* *}
* *// если НПС маг воды
* *else if(self.guild == GIL_KDW)
* *{
* * * *randyKDW = Hlp_Random(2500);
* * * *randyKDW_Lightstar= Hlp_Random(2);
* * * *// случайное время *
* * * *if(Npc_GetStateTime(self) > randyKDW)
* * * *{
* * * * * *// выравнивание
* * * * * *AI_AlignToWP(self);
* * * * * *// сброс времени цикла
* * * * * *Npc_SetStateTime(self,0);
* * * * * *// анимация "Дрожь земли"
* * * * * *Wld_PlayEffect("FX_EarthQuake",self,self,0,0,0,FA LSE );
* * * * * *// упражнение в магии
* * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC5");
* * * * * *// далее какие-то эффекты, кто знает, что делают маги воды в Круге солнца, может написать
* * * * * *Wld_PlayEffect("spellFX_RingRitual2",ItMi_AmbossE ffekt_Addon,ItM
i_AmbossEffekt_Addon,0,0,0,FALSE);
* * * * * *if(randyKDW_Lightstar == 0)
* * * * * *{
* * * * * * * *Wld_PlayEffect("spellFX_RingRitual1",ItMi_AmbossE ffekt_Addon,ItM
i_AmbossEffekt_Addon,0,0,0,FALSE);
* * * * * *}
* * * * * *else if(randyKDW_Lightstar == 1)
* * * * * *{
* * * * * * * *Wld_PlayEffect("spellFX_LIGHTSTAR_RingRitual",ItM i_AmbossEffekt_
Addon,ItMi_AmbossEffekt_Addon,0,0,0,FALSE);
* * * * * *};
* * * *};
* *}
* *// если квест по восстановлению Глаза Инноса не завершен
* *else if(MIS_RitualInnosEyeRepair != LOG_SUCCESS)
* *{
* * * *randy = Hlp_Random(1000);
* * * *// случайное время *
* * * *if(Npc_GetStateTime(self) > randy)
* * * *{
* * * * * *// сброс времени цикла
* * * * * *Npc_SetStateTime(self,0);
* * * * * *// анимация "Дрожь земли"
* * * * * *Wld_PlayEffect("FX_EarthQuake",self,self,0,0,0,FA LSE);
* * * * * *// упражнение в магии
* * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC5");
* * * * * *// если НПС Ксардас
* * * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Xardas))
* * * * * *{
* * * * * * * *// анимация фиолетового экрана
* * * * * * * *Wld_PlayEffect("spellFX_INCOVATION_VIOLET",self,s elf,0,0,0,FALSE
);
* * * * * *}
* * * * * *// если НПС Пирокар
* * * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Pyrokar))
* * * * * *{
* * * * * * * *// анимация красного экрана
* * * * * * * *Wld_PlayEffect("spellFX_INCOVATION_RED",self,self ,0,0,0,FALSE);
* * * * * *}
* * * * * *else // иначе Ватрас
* * * * * *{
* * * * * * * *// анимация голубого экрана
* * * * * * * *Wld_PlayEffect("spellFX_INCOVATION_BLUE",self,sel f,0,0,0,FALSE);
* * * * * *};
* * * *}; *
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Circle_End()
{
};

... ещё файл

// ***************************************
// Обработчик концерта InExtremo в аддоне
// ***************************************

// Функция инициализации состояния
func void ZS_Concert()
{ *
* *// установить нормальный набор восприятий
* *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);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};
* *
// Функция цикла состояния
func int ZS_Concert_Loop ()
{
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// если НПС "Yellow Pfeiffer"
* * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1394_Addon_InExtremo_YellowP feiffer))
* * * *{
* * * * * *// использует Желтую волынку
* * * * * *AI_UseItemToState(self,ItMi_IEDudelGelb,1);
* * * *}
* * * *// если НПС "Dr. Pymonte"
* * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1390_Addon_InExtremo_DrPymon te))
* * * *{
* * * * * *// использует Арфу
* * * * * *AI_UseItemToState(self,ItMi_IEHarfe,1);
* * * *}
* * * *// если НПС "The Flail"
* * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1391_Addon_InExtremo_TheFlai l))
* * * *{
* * * * * *// использует Drum
* * * * * *AI_UseItemToState(self,ItMi_iedrum,1);
* * * *}
* * * *// если НПС "Thomas the forger"
* * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1392_Addon_InExtremo_ThomasT heForger))
* * * *{
* * * * * *// использует Виолончель
* * * * * *AI_UseItemToState(self,ItMi_IECello,1);
* * * *}
* * * *// если НПС "Unicorn"
* * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1393_Addon_InExtremo_Unicorn ))
* * * *{
* * * * * *// использует Лютню
* * * * * *AI_UseItemToState(self,ItMi_IELaute,1);
* * * *}
* * * *// если НПС "Lutter"
* * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1395_Addon_InExtremo_Lutter) )
* * * *{
* * * * * *// использует Drumscheit
* * * * * *AI_UseItemToState(self,ItMi_IEDrumscheit,1);
* * * *}
* * * *// если НПС "Flex"
* * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1396_Addon_InExtremo_Flex))
* * * *{
* * * * * *// использует Голубую волынку
* * * * * *AI_UseItemToState(self,ItMi_IEDudelBlau,1);
* * * *}
* * * *else
* * * *{
* * * * * * // Танцы пиратов?
* * * *};
* * * *// установка флага
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Concert_End()
{
* *// шестерка музыкантов, кроме Flexа, убирают свои инструменты
* *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1394_Addon_InExtremo_YellowP feiffer))
* *{
* * * *AI_UseItemToState(self,ItMi_IEDudelGelb,-1);
* *}
* *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1390_Addon_InExtremo_DrPymon te))
* *{
* * * *AI_UseItemToState(self,ItMi_IEHarfe,-1);
* *}
* *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1391_Addon_InExtremo_TheFlai l))
* *{
* * * *AI_UseItemToState(self,ItMi_iedrum,-1);
* *}
* *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1392_Addon_InExtremo_ThomasT heForger))
* *{
* * * *AI_UseItemToState(self,ItMi_IECello,-1);
* *}
* *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1393_Addon_InExtremo_Unicorn ))
* *{
* * * *AI_UseItemToState(self,ItMi_IELaute,-1);
* *}
* *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1395_Addon_InExtremo_Lutter) )
* *{
* * * *AI_UseItemToState(self,ItMi_IEDrumscheit,-1);
* *};
};

Ответить с цитированием
Старый 24.04.2005, 14:08   #151
Vam

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

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

// ***************************************
// Обработчик приготовления пищи в котле
// ***************************************

// Функция инициализации состояния
func void ZS_Cook_Cauldron()
{
* *// установить нормальный набор восприятий
* *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);
* *};
* *// если НПС не имеет ложки
* *if(Npc_HasItems(self,ItMi_Scoop) == 0)
* *{
* * * *// создать в инвентаре НПС ложку
* * * *CreateInvItem(self,ItMi_Scoop); * * * * * *
* *};
};

// Функция цикла состояния
func int ZS_Cook_Cauldron_Loop()
{
* *// если действие с МОВом не прерываемо и котел имеется
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"CAULDRON"))
* *{
* * * *// мешать ложкой в котле
* * * *AI_UseMob(self,"CAULDRON",1);
* *};
* *return LOOP_CONTINUE;
};

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

... ещё файл

// *******************************************
// Обработчик приготовления пищи на сковороде
// *******************************************

// Функция инициализации состояния
func void ZS_Cook_Pan()
{
* *// установить нормальный набор восприятий
* *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);
* *};
* *// если НПС не имеет Сырого мяса
* *if(Npc_HasItems(self,ItFoMuttonRaw) == 0)
* *{
* * * *// создать в инвентаре НПС Сырое мясо
* * * *CreateInvItem(self,ItFoMuttonRaw); * * * * * * *
* *};
};

// Функция цикла состояния
func int ZS_Cook_Pan_Loop()
{
* *// если действие с МОВом не прерываемо и сковорода имеется
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"PAN"))
* *{
* * * *// жарить мясо
* * * *AI_UseMob(self,"PAN",1);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Cook_Pan_End()
{
* *// прекратить использовать котел
* *AI_UseMob(self,"PAN",-1);
* *// съесть жареное мясо
* *AI_UseItem(self,ItFoMutton);
};

... ещё файл

// *************************************
// Обработчик приготовления пищи в печи
// *************************************

// Функция инициализации состояния
func void ZS_Cook_Stove()
{
* *// установить нормальный набор восприятий
* *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);
* *};
* *// если НПС не имеет Сырого мяса
* *if(Npc_HasItems(self,ItFoMuttonRaw) == 0)
* *{
* * * *// создать в инвентаре НПС Сырое мясо
* * * *CreateInvItem(self,ItFoMuttonRaw); * * * * * * *
* *};
};

// Функция цикла состояния
func int ZS_Cook_Stove_Loop()
{
* *// если действие с МОВом не прерываемо и печь имеется
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"STOVE"))
* *{
* * * *// жарить мясо
* * * *AI_UseMob(self,"STOVE",1);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Cook_Stove_End()
{
* *// прекратить использовать печь
* *AI_UseMob(self,"STOVE",-1);
* *// если НПС имеет больше 1 куска жареного мяса
* *if(Npc_HasItems(self,ItFoMutton) >=1 )
* *{
* * * *// удалить из инветаря НПС 1 кусок жареного мяса
* * * *Npc_RemoveInvItems(self,ItFoMutton,1);
* *}; *
};

... ещё файл

// ***********************
// Обработчик танцев НПС
// ***********************

// Функция инициализации состояния
func void ZS_Dance()
{
* *// установить нормальный набор восприятий
* *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);
* * * *// выравнивание
* * * *AI_AlignToWP(self);
* *};
};

// Функция цикла состояния
func int ZS_Dance_Loop()
{
* *var int danceStyle;
* *danceStyle = Hlp_Random(9);
* *// случайная анимация фаз танца
* *if(danceStyle == 0)
* *{
* * * *AI_PlayAni(self,"T_DANCE_01");
* *};
* *if(danceStyle == 1)
* *{
* * * *AI_PlayAni(self,"T_DANCE_02");
* *};
* *if(danceStyle == 2)
* *{
* * * *AI_PlayAni(self,"T_DANCE_03");
* *};
* *if(danceStyle == 3)
* *{
* * * *AI_PlayAni(self,"T_DANCE_04");
* *};
* *if(danceStyle == 4)
* *{
* * * *AI_PlayAni(self,"T_DANCE_05");
* *};
* *if(danceStyle == 5)
* *{
* * * *AI_PlayAni(self,"T_DANCE_06");
* *};
* *if(danceStyle == 6)
* *{
* * * *AI_PlayAni(self,"T_DANCE_07");
* *};
* *if(danceStyle == 7)
* *{
* * * *AI_PlayAni(self,"T_DANCE_08");
* *};
* *if(danceStyle == 8 )
* *{
* * * *AI_PlayAni(self,"T_DANCE_09");
* *};
* *// движение на свой вайпоинт
* *AI_GotoWP(self,self.wp);
* *// выравнивание
* *AI_AlignToWP(self);
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Dance_End()
{
* *// танцор останавливается
* *AI_StandUp(self);
};

... ещё файл

// **************************************
// Обработчик убегания НПС на свою точку
// **************************************

// Функция инициализации состояния
func void ZS_FleeToWp()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// если НПС Корнелиус
* *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Cornelius))
* *{
* * * *// закрыть восприятие входа в помещение
* * * *Npc_PercDisable(self,PERC_ASSESSENTERROOM);
* *};
* *// установить режим передвижения бегом
* *AI_SetWalkmode(self,NPC_RUN);
* *// включить модель убегающего человека
* *Mdl_ApplyOverlayMds(self,"HUMANS_FLEE.MDS");
* *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций
* *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_FleeToWp_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_FleeToWp_End()
{ *
};

Ответить с цитированием
Старый 25.04.2005, 16:44   #152
Vam

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

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

// *********************************
// Обработчик следования НПС за ГГ
// *********************************

// Функция локального восприятия НПС на ГГ
func void B_AssessFollowPlayer()
{
* *// если НПС Диего в Минентале
* *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(DiegoOW))
* *{ *
* * * *// расстояние между НПС и ГГ < дистанции следования и флаг сброшен (НПС движется)
* * * *if(Npc_GetDistToNpc(self,hero) < self.aivar[AIV_FollowDist]) && (self.aivar[AIV_TAPOSITION] == FALSE)
* * * *{
* * * * * *// очистить очередь AI состояний НПС
* * * * * *Npc_ClearAIQueue(self);
* * * * * *// НПС встает (ждет действий ГГ)
* * * * * *AI_StandUp(self);
* * * * * *// установить флаг (НПС остановился)
* * * * * *self.aivar[AIV_TAPOSITION] = TRUE;
* * * *}
* * * *// если Диего слишком далеко и флаг сброшен
* * * *else if(C_DiegoTooFar(0)) && (self.aivar[AIV_TAPOSITION] == FALSE)
* * * *{
* * * * * *// очистить очередь AI состояний Диего
* * * * * *Npc_ClearAIQueue(self);
* * * * * *// Диего встает (ждет действий ГГ)
* * * * * *AI_StandUp(self);
* * * * * *// установить флаг
* * * * * *self.aivar[AIV_TAPOSITION] = TRUE;
* * * * * *// если расстояние между Диего и ГГ > дистанции начала разговора
* * * * * *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG)
* * * * * *{
* * * * * * * *// Диего говорит ГГ (SVM фраза) "Подожди!" (Примечание: правильней other заменить на hero)
* * * * * * * *B_Say(self,other,"$SC_HEYWAITASECOND");
* * * * * *};
* * * *}
* * * *else // иначе
* * * *{ *
* * * * * *// обычная реакция НПС на ГГ
* * * * * *B_AssessPlayer();
* * * *};
* * * *return;
* *};
* *// расстояние между НПС и ГГ < дистанции следования и флаг сброшен
* *if(Npc_GetDistToNpc(self,hero) < self.aivar[AIV_FollowDist]) && (self.aivar[AIV_TAPOSITION] == FALSE)
* *{
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// НПС встает (ждет действий ГГ)
* * * *AI_StandUp(self);
* * * *// установить флаг
* * * *self.aivar[AIV_TAPOSITION] = TRUE;
* *}
* *else
* *{ *
* * * *// обычная реакция НПС на ГГ
* * * *B_AssessPlayer();
* *};
};

// Функция локального восприятия НПС на звук сражения
func void B_AssessFollowFightSound()
{
* *// если other (нападающий) есть ГГ или victim (жертва) есть ГГ или
* *if(Npc_IsPlayer(other)) ¦¦ (Npc_IsPlayer(victim))
* *¦¦ (other.aivar[AIV_PARTYMEMBER] == TRUE) * * * * * // other - член партии ГГ
* *¦¦ (victim.aivar[AIV_PARTYMEMBER] == TRUE) * * * * *// или victim - член партии ГГ
* *{
* * * *// обычная реакция НПС на звук сражения
* * * *B_AssessFightSound();
* *};
};

// Данная функция не используется и может быть удалена.
func void B_MoveFollowNpc()
{
};

// Функция инициализации состояния
func void ZS_Follow_Player()
{
* *// разрешить НПС все чувства
* *self.senses = SENSE_SEE|SENSE_HEAR|SENSE_SMELL;
* *// установить дальность чувств 20 метров
* *self.senses_range = 2000; * * *
* *// установить время реакции на восприятия 0.3 сек
* *Npc_SetPercTime(self,0.3);
* *// разрешить минимальный набор восприятий
* *Perception_Set_Minimal();
* *// установить локальное восприятие НПС на ГГ
* *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessFol lowPlayer);
* *// разрешить восприятие врага
* *Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnem y);
* *// разрешить восприятие разговора
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;
* *// разрешить восприятие перемещения МОВа
* *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);
* *// установить локальное восприятие звуков сражения
* *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sFollowFightSound);
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// НПС встает
* *AI_StandUp(self);
* *// установить режим передвижения бегом
* *AI_SetWalkmode(self,NPC_RUN);
* *// если дистанция между НПС не задана
* *if(self.aivar[AIV_FollowDist] == 0)
* *{
* * * *// задать дистанцию 5м
* * * *self.aivar[AIV_FollowDist] = 500;
* *};
};

// Функция цикла состояния
func int ZS_Follow_Player_Loop()
{
* *// расстояние между НПС и ГГ > дистанции следования
* *if(Npc_GetDistToNpc(self,hero) > self.aivar[AIV_FollowDist])
* *{
* * * *// если НПС Диего в Минентале
* * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(DiegoOW))
* * * *{
* * * * * *// если Диего слишком далеко
* * * * * *if(C_DiegoTooFar(0))
* * * * * *{
* * * * * * * *// если прошло > 1 сек
* * * * * * * *if(Npc_GetStateTime(self) > 1)
* * * * * * * *{
* * * * * * * * * *// Диего поворачивается к ГГ
* * * * * * * * * *B_TurnToNpc(self,hero);
* * * * * * * * * *// сброс времени цикла
* * * * * * * * * *Npc_SetStateTime(self,0);
* * * * * * * *};
* * * * * * * *return LOOP_CONTINUE;
* * * * * *};
* * * *};
* * * *// если НПС не плывет
* * * *if(!C_BodyStateContains(self,BS_SWIM))
* * * *{ *
* * * * * *// установить режим передвижения бегом
* * * * * *AI_SetWalkmode(self,NPC_RUN);
* * * *};
* * * *// НПС движется к ГГ
* * * *AI_GotoNpc(self,hero);
* * * *// сброс флага (НПС в движении)
* * * *self.aivar[AIV_TAPOSITION] = FALSE;
* *}
* *else // расстояние < дистанции следования
* *{
* * * *// если прошло > 1 сек
* * * *if(Npc_GetStateTime(self) > 1)
* * * *{
* * * * * *// НПС поворачивается к ГГ
* * * * * *B_TurnToNpc(self,hero);
* * * * * *// сброс времени цикла
* * * * * *Npc_SetStateTime(self,0);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Follow_Player_End()
{
};

... ещё файл

// **********************************
// Обработчик поведения призраков
// **********************************

// Функция инициализации состояния
func void ZS_Ghost()
{
* *var C_NPC Quarho;
* *// получить ссылку на Куарходрона
* *Quarho = Hlp_GetNpc(NONE_ADDON_111_Quarhodron);
* *// если НПС Куарходрон
* *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Quarho))
* *{
* * * *// если информация о "Камерах Аданоса" не известна
* * * *if(Ghost_SCKnowsHow2GetInAdanosTempel == FALSE)
* * * *{ *
* * * * * *// разрешить восприятие разговора
* * * * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;
* * * *}; *
* *}
* *else
* *{
* * * *// разрешить восприятие разговора
* * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;
* *}; *
* *// разрешить восприятие повреждения
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить время реакции на восприятия 0.1 сек
* *Npc_SetPercTime(self,0.1);
* *// НПС встает
* *AI_StandUp(self); * * * * * * *
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// движение на свой вайпоинт
* *AI_GotoWP(self, self.wp);
* *// выравнивание
* *AI_AlignToWP(self);
};

// Функция цикла состояния
func int ZS_Ghost_Loop()
{
* *// если прошло >= 5 сек
* *if(Npc_GetStateTime(self) >= 5)
* *{
* * * *// если расстояние между НПС и ГГ > дистанции начала диалога
* * * *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG)
* * * *{
* * * * * *// выравнивание
* * * * * *AI_AlignToWP(self);
* * * * * *// сброс времени состояния
* * * * * *Npc_SetStateTime(self,0);
* * * *};
* * * *// удалить призрака
* * * *B_RemoveGhost();
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Ghost_End()
{
};

// ******************************
// Обработчик поведения Радемеса
// ******************************

// Функция инициализации состояния
func void ZS_GhostWusel()
{
* *// разрешить восприятие разговора
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;
* *// разрешить восприятие повреждения
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// НПС встает
* *AI_StandUp(self); *
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// если НПС расположен не на своем вайпоинте
* *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.WP);
* *};
* *// движение на свободный фрипоинт
* *AI_GotoFP(self,"FP_ROAM");
};

// Функция цикла состояния (Радемес бродит по фрипоинтам)
func int ZS_GhostWusel_Loop()
{
* *// если прошло >= 3 сек
* *if(Npc_GetStateTime(self) >= 3)
* *{
* * * *// если Радемес находится на фрипоинте
* * * *if(Npc_IsOnFP(self,"FP_ROAM"))
* * * *{
* * * * * *// если есть свободный следующий фрипоинт
* * * * * *if(Wld_IsNextFPAvailable(self,"FP_ROAM"))
* * * * * *{
* * * * * * * *// очистка очереди AI ссостояний НПС
* * * * * * * *Npc_ClearAIQueue(self);
* * * * * * * *// переход на следующий фрипоинт
* * * * * * * *AI_GotoNextFP(self,"FP_ROAM");
* * * * * *};
* * * *}
* * * *else // не на фрипоинте
* * * *{
* * * * * *// если НПС не передвигается
* * * * * *if(!C_BodyStateContains(self,BS_WALK)) && (!C_BodyStateContains(self,BS_RUN))
* * * * * *{
* * * * * * * *// перейти на фрипоинт
* * * * * * * *AI_GotoFP(self,"FP_ROAM");
* * * * * *};
* * * *};
* * * *// сброс времени состояния
* * * *Npc_SetStateTime(self,0);
* *}; *
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_GhostWusel_End()
{
};

Ответить с цитированием
Старый 26.04.2005, 17:36   #153
Vam

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

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

// **********************************
// Охрана Святого молота Гарвигом
// **********************************

// Функция инициализации состояния
func void ZS_Guard_Hammer()
{ *
* *// установить нормальный набор восприятий
* *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);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Guard_Hammer_loop()
{
* *// если НПС находится на фрипоинте охраны
* *if(Npc_IsOnFP(self,"STAND"))
* *{ *
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *}
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выровняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выровняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// анимация перехода в режим охраны
* * * *AI_PlayAni(self,"T_STAND_2_HGUARD");
* * * *// установить флаг охраны
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *}; *
* *// если НПС имеет Святой молот и расстояние до места хранения молота < 5м
* *if(Npc_HasItems(self,Holy_Hammer_MIS) == 1) && (Npc_GetDistToWP(self,"NW_MONASTERY_SANCTUM_01") <= 500)
* *{
* * * *// изъять из инвентаря НПС Святой молот
* * * *Npc_RemoveInvItems(self,Holy_Hammer_MIS,1);
* * * *// положить молот в точку хранения
* * * *Wld_InsertItem(Holy_Hammer_MIS,"FP_HAMMER");
* *};
* *// если прошло > 5 сек и НПС находится в режиме охраны
* *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))
* *{
* * * *var int random;
* * * *random = Hlp_Random(10);
* * * *// с вероятностью 0.1
* * * *if(random == 0)
* * * *{
* * * * * *// осмотреть окрестности
* * * * * *AI_PlayAni(self,"T_HGUARD_LOOKAROUND");
* * * *};
* * * *// сброс времени цикла
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Guard_Hammer_end()
{
* *// анимация перехода из состояния охраны в стоячее
* *AI_PlayAni(self,"T_HGUARD_2_STAND");
}; *

... ещё файл

// ************************
// Охрана прохода НПС
// ************************

// Функция инициализации состояния
func void ZS_Guard_Passage()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll (self);
* *// установить время реакции на восприятия 0.1 сек
* *Npc_SetPercTime(self,0.1);
* *// НПС встает
* *AI_StandUp(self); * * * * * * *
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// движение на свой вайпоинт
* *AI_GotoWP(self,self.wp);
* *// если расстояние между НПС и ГГ > дистанции диалога
* *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG)
* *{
* * * *// выровняться
* * * *AI_AlignToWP(self);
* *};
};

// Функция цикла состояния
func int ZS_Guard_Passage_Loop()
{
* *// если прошло >= 3 сек
* *if (Npc_GetStateTime(self) >= 3)
* *{
* * * *// если расстояние между НПС и ГГ > дистанции диалога
* * * *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG)
* * * *{
* * * * * *// выровняться
* * * * * *AI_AlignToWP(self);
* * * * * *// сброс времени цикла
* * * * * *Npc_SetStateTime(self,0);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Guard_Passage_End ()
{
};

... ещё файл

// *********************************
// Обработчик следования ГГ за НПС
// *********************************

// Функция локального восприятия НПС на ГГ
func void B_AssessGuidePlayer()
{
* *// если расстояние между НПС и ГГ > 8м
* *if(Npc_GetDistToNpc(self,hero) > 800)
* *{
* * * *// если расстояние от НПС до его вайпоинта < расстояния от ГГ до этого же вайпоинта
* * * *if(Npc_GetDistToWP(self,self.wp) < Npc_GetDistToWP(hero,self.wp))
* * * *{
* * * * * *// очистить очередь AI состояний НПС
* * * * * *Npc_ClearAIQueue(self);
* * * * * *// НПС встает
* * * * * *AI_StandUp(self);
* * * * * *// НПС поворачивается к ГГ
* * * * * *B_TurnToNpc(self,hero);
* * * *};
* * * *// если расстояние между НПС и ГГ > 12м и враги у НПС есть и отношения между НПС и ГГ враждебные
* * * *if(Npc_GetDistToNpc(self,hero) > 1200) && (self.aivar[AIV_EnemyOverride] == TRUE) && (Npc_GetAttitude(self,hero) == ATT_HOSTILE)
* * * *{
* * * * * *// сброс флага врагов (врагов и НПС нет)
* * * * * *self.aivar[AIV_EnemyOverride] = FALSE;
* * * *};
* *}
* *else
* *{
* * * *// обычная реакция НПС на ГГ
* * * *B_AssessPlayer();
* *};
};

// Функция локального восприятия НПС на звук сражения
func void B_AssessGuideFightSound()
{
* *// если other (нападающий) есть ГГ или victim (жертва) есть ГГ
* *if(Npc_IsPlayer(other)) ¦¦ (Npc_IsPlayer(victim))
* *{
* * * *// обычная реакция НПС на звук сражения
* * * *B_AssessFightSound();
* *};
};

// Функция инициализации состояния
func void ZS_Guide_Player()
{
* *// разрешить минимальный набор восприятий
* *Perception_Set_Minimal();
* *// перевод НПС в исходное состояние
* *B_ResetAll (self);
* *// разрешить НПС все чувства
* *self.senses = SENSE_SEE ¦ SENSE_HEAR ¦ SENSE_SMELL;
* *// установить дальность чувств 20 метров
* *self.senses_range = 2000;
* *// установить время реакции НПС на восприятия 1 сек
* *Npc_SetPercTime(self,1);
* *// установить локальное восприятие НПС на ГГ
* *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessGui dePlayer);
* *// разрешить восприятие врага
* *Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnem y);
* *// разрешить восприятие разговора
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;
* *// разрешить восприятие перемещения МОВа
* *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);
* *// установить локальное восприятие звуков сражения
* *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sGuideFightSound);
};

// Функция цикла состояния
func int ZS_Guide_Player_Loop()
{ *
* *// если расстояние между НПС и ГГ > 8м и расстояние от НПС до его вайпоинта < расстояния от ГГ до этого же вайпоинта
* *if(Npc_GetDistToNpc(self,hero) > 800) && (Npc_GetDistToWP(self,self.wp) < Npc_GetDistToWP(hero,self.wp))
* *{
* * * *// локальная реакция НПС на ГГ
* * * *B_AssessGuidePlayer();
* *}
* *// если расстояние между НПС и его вайпоинтом > 3м
* *else if(Npc_GetDistToWP(self,self.wp) > 300)
* *{
* * * *// если НПС не плывет
* * * *if(!C_BodyStateContains(self,BS_SWIM))
* * * *{
* * * * * *// установить режим передвижения бегом
* * * * * *AI_SetWalkmode(self,NPC_RUN);
* * * *};
* * * *// движение НПС на вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *}
* *else
* *{
* * * *// НПС поворачивается к ГГ
* * * *B_TurnToNpc(self,hero);
* *};
* *return LOOP_CONTINUE;
};
* *
// Функция завершения состояния
func int ZS_Guide_Player_End()
{ *
};

... ещё файл

// *****************************
// НПС справляет малую нужду
// *****************************

// Функция инициализации состояния
func void ZS_Pee()
{
* *// установить нормальный набор восприятий
* *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);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Pee_loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"PEE"))
* *{
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *}
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"PEE"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"PEE");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выровняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выровняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK )
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *}; *
* *};
* *// если флаг сброшен и НПС на нужном фрипоинте
* *if((self.aivar[AIV_TAPOSITION] == NOTINPOS) && (Npc_IsOnFP(self,"PEE")))
* *{
* * * *// выровняться
* * * *AI_AlignToFP(self);
* * * *// встать
* * * *AI_StandUp(self);
* * * *// анимация мочеиспускания
* * * *AI_PlayAni(self,"T_STAND_2_PEE");
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Pee_end()
{
* *// прекратить мочеиспускание
* *AI_PlayAni(self,"T_PEE_2_STAND");
};


Ответить с цитированием
Старый 28.04.2005, 09:08   #154
Vam

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

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

// ************************************************** *******
// НПС бродит по PICK фрипоинтам (что-то ищет или собирает)
// ************************************************** *******

// Функция инициализации состояния
func void ZS_Pick_FP()
{ *
* *// установить нормальный набор восприятий
* *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_Pick_FP_Loop()
{
* *// если время состояния >= 7сек и с вероятностью 0.5
* *if((Npc_GetStateTime(self) >= 7) && (Hlp_Random(2))) *
* *{
* * * *// если НПС на фрипоинте и есть еще фрипоинт
* * * *if((Npc_IsOnFP(self,"PICK")) && (Wld_IsFPAvailable(self,"PICK")))
* * * *{
* * * * * *// НПС идет на следующий фрипоинт
* * * * * *AI_GotoNextFP(self,"PICK");
* * * * * *// анимация поиска
* * * * * *AI_PlayAni(self,"T_PLUNDER");
* * * * * *// сброс времени цикла
* * * * * *Npc_SetStateTime(self,0);
* * * *}
* * * *// если НПС на фрипоинте
* * * *else if(Npc_IsOnFP(self,"PICK"))
* * * *{
* * * * * *// анимация поиска
* * * * * *AI_PlayAni(self,"T_PLUNDER");
* * * * * *// сброс времени цикла
* * * * * *Npc_SetStateTime(self,0);
* * * *};
* * * *// установить режим передвижения шагом
* * * *AI_SetWalkmode(self,NPC_WALK); * * *
* *}
* *// если время состояния >= 7сек
* *else if(Npc_GetStateTime(self) >= 7)
* *{
* * * *// если НПС на фрипоинте
* * * *if(Npc_IsOnFP(self,"PICK"))
* * * *{ * * *
* * * * * *// анимация поиска
* * * * * *AI_PlayAni(self,"T_PLUNDER"); *
* * * *};
* * * *// установить режим передвижения шагом
* * * *AI_SetWalkmode (self,NPC_WALK); * *
* *};
* *// если НПС не на фрипоинте и есть еще фрипоинт
* *if((!Npc_IsOnFP(self,"PICK")) && (Wld_IsFPAvailable(self,"PICK")))
* *{
* * * *// НПС идет на фрипоинт
* * * *AI_GotoFP(self,"PICK");
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Pick_FP_End()
{
};

... ещё файл

// *********************
// НПС добывает руду
// *********************

// Функция инициализации состояния
func void ZS_Pick_Ore()
{
* *// установить нормальный набор восприятий
* *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);
* *};
* *// если НПС не имеет кирки
* *if(Npc_HasItems(self,ItMw_2H_Axe_L_01) == 0)
* *{
* * * *// создать в инвентаре НПС кирку
* * * *CreateInvItem(self,ItMw_2H_Axe_L_01); * * * * * * *
* *};
* *// взять в руки кирку
* *EquipItem(self,ItMw_2H_Axe_L_01);
};

// Функция цикла состояния
func int ZS_Pick_Ore_Loop()
{
* *// если действие с МОВом не прерываемо и залежи руды имеются
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"ORE"))
* *{
* * * *// добыча руды
* * * *AI_UseMob(self,"ORE",1);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Pick_Ore_End()
{
* *// прекратить добычу руды
* *AI_UseMob(self,"ORE",-1);
};

... ещё файл

// *****************
// Игра на лютне
// *****************

func void ZS_Play_Lute()
{ *
* *// установить нормальный набор восприятий
* *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);
* *};
* *// если НПС не имеет лютни
* *if(Npc_HasItems(self,ItMi_Lute) == 0)
* *{
* * * *// создать в инвентаре НПС лютню
* * * *CreateInvItem(self,ItMi_Lute);
* *}; *
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};
* *
// Функция цикла состояния
func int ZS_Play_Lute_Loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"STAND"))
* *{ *
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *}; *
* *} *
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выровняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выровняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// играть на лютне
* * * *AI_UseItemToState(self,ItMi_Lute,1);
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Play_Lute_End()
{
* *// прекратить игру на лютне
* *AI_UseItemToState(self,ItMi_Lute,-1);
};

... ещё файл

// ************************************
// Приготовление алхимических напитков
// ************************************

// Функция инициализации состояния
func void ZS_Potion_Alchemy()
{ *
* *// установить нормальный набор восприятий
* *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);
* *};
* *// если НПС не имеет Лабораторной колбы
* *if(Npc_HasItems(self,ItMi_Flask) == 0)
* *{
* * * *// создать в инвентаре НПС Лабораторную колбу
* * * *CreateInvItem(self,ItMi_Flask); * * * * * *
* *};
};

// Функция цикла состояния
func int ZS_Potion_Alchemy_Loop()
{
* *// если действие с МОВом не прерываемо и лабораторный стол имеется
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"LAB"))
* *{
* * * *// изготовление напитка
* * * *AI_UseMob(self,"LAB",1);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Potion_Alchemy_End()
{
* *// прекратить алхимию
* *AI_UseMob(self,"LAB",-1);
};

... ещё файл

// *****************************
// Тренировка магии
// *****************************

// Функция инициализации состояния
func void ZS_Practice_Magic()
{
* *// установить нормальный набор восприятий
* *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_Practice_Magic_Loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"STAND"))
* *{
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *}
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выровняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выровняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK )
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *}; *
* *};
* *// если время состояния > 7сек и флаг сброшен
* *if((Npc_GetStateTime(self) > 7) && (self.aivar[AIV_TAPOSITION] == NOTINPOS))
* *{
* * * *var int zufall;
* * * *zufall = Hlp_Random(100);
* * * *// с разной вероятностью выполнять магические упражнения
* * * *if(zufall <= 25)
* * * *{
* * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC");
* * * *}
* * * *else if(zufall <= 50)
* * * *{
* * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC2");
* * * *}
* * * *else if(zufall <= 70)
* * * *{
* * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC3");
* * * *}
* * * *else if(zufall <= 90)
* * * *{
* * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC4");
* * * *}
* * * *else
* * * *{
* * * * * *AI_PlayAni(self,"R_SCRATCHHEAD");
* * * *};
* * * *// сброс времени состояния
* * * *Npc_SetStateTime(self,0);
* *}; *
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Practice_Magic_End()
{
};

... ещё файл

// **********************
// Упражнения с мечом
// **********************

// Функция инициализации состояния
func void ZS_Practice_Sword()
{
* *// установить нормальный набор восприятий
* *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);
* * * *// выравнивание
* * * *AI_AlignToWP(self);
* *};
* *// взять в руки лучшее оружие ближнего радиуса поражения
* *AI_EquipBestMeleeWeapon(self);
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Practice_Sword_Loop()
{ *
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// если НПС не имеет оружия ближнего радиуса поражения
* * * *if(!Npc_HasEquippedMeleeWeapon(self))
* * * *{
* * * * * *// создать в инвентаре НПС Тяжелую палку
* * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1);
* * * * * *// взять её в руки
* * * * * *AI_EquipBestMeleeWeapon(self);
* * * *};
* * * *// подготовиться
* * * *AI_ReadyMeleeWeapon(self);
* * * *// установка флага готовности
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *// анимация упражнений
* *AI_PlayAni(self,"T_1HSFREE");
* *// движение на свой вайпоинт
* *AI_GotoWP(self,self.wp);
* *// выравняться
* *AI_AlignToWP(self);
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Practice_Sword_End()
{
* *// встать
* *AI_StandUp(self);
* *// убрать оружие
* *AI_RemoveWeapon(self);
};

Ответить с цитированием
Старый 28.04.2005, 22:25   #155
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

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

Вот-с, сподобился наконец-то обновить файлик :D :D
Теперь в .chm - вроде удобней ;)
Отправить личное сообщение для Ответить с цитированием
Старый 29.04.2005, 10:32   #156
Vam

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

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

// *************************
// Молитва статуям Инноса
// *************************

// Функция инициализации состояния
func void ZS_Pray_Innos()
{
* *// установить нормальный набор восприятий
* *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_Pray_Innos_Loop()
{
* *// если действие с МОВом не прерываемо и статуя имеется
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"INNOS"))
* *{
* * * *// молитва
* * * *AI_UseMob(self,"INNOS",1);
* *};
* *// если прошло > 5 сек и и действие прерываемо
* *if(Npc_GetStateTime(self) > 5) && (C_BodyStateContains(self,BS_MOBINTERACT_INTERRUPT ))
* *{
* * * *// сброс времени состояния
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

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

... ещё файл

// **************************************
// Молитва Инносу на заданной точке PRAY
// **************************************

// Функция инициализации состояния
func void ZS_Pray_Innos_FP()
{
* *// установить нормальный набор восприятий
* *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_Pray_Innos_FP_Loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"PRAY"))
* *{
* * * *// если НПС не сидит
* * * *if(!C_BodyStateContains(self,BS_SIT))
* * * *{
* * * * * *// выравнивание
* * * * * *AI_AlignToFP(self);
* * * * * *// анимация молитвы
* * * * * *AI_PlayAniBS(self,"T_STAND_2_PRAY",BS_SIT); * *
* * * *}
* * * *else
* * * *{
* * * * * *// анимация молитвы
* * * * * *AI_PlayAniBS(self,"T_PRAY_RANDOM",BS_SIT);
* * * *}; * * *
* *}
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"PRAY"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"PRAY");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выровняться
* * * *AI_AlignToFP(self);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Pray_Innos_FP_End()
{
* *// закончить молитву
* *NPC_StopAni(self,"T_PRAY_RANDOM");
* *// анимация перехода в стоячее состояние
* *AI_PlayAni(self,"T_PRAY_2_STAND"); *
};

... ещё файл

// ************************
// Молитва статуям Белиара
// ************************
// Примечание: В скриптах не используется, может быть удалена c корректировкой файла ТА.d

// Функция инициализации состояния
func void ZS_Pray_Sleeper()
{
* *// установить нормальный набор восприятий
* *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_Pray_Sleeper_Loop()
{
* *// если действие с МОВом не прерываемо и статуя имеется
* *if(!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) && (Wld_IsMobAvailable(self,"IDOL"))
* *{
* * * *// молитва
* * * *AI_UseMob(self,"IDOL",1);
* *};
* *return LOOP_CONTINUE;
};

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

... ещё файл

// ****************************************
// Молитва Белиару на заданной точке PRAY
// ****************************************
// Аналогична молитве Инносу на такой же точке
// Примечание: В скриптах не используется, может быть удалена c корректировкой файла ТА.d

func void ZS_Pray_Sleeper_FP()
{
* *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_Pray_Sleeper_FP_Loop()
{
* *if(Npc_IsOnFP(self,"PRAY"))
* *{ *
* * * *if(!C_BodyStateContains(self,BS_SIT))
* * * *{
* * * * * *AI_PlayAniBS(self,"T_STAND_2_PRAY",BS_SIT); * *
* * * *}
* * * *else
* * * *{
* * * * * *AI_PlayAniBS(self,"T_PRAY_RANDOM",BS_SIT);
* * * *}; * * *
* *}
* *else if(Wld_IsFPAvailable(self,"PRAY"))
* *{
* * * *AI_GotoFP(self,"PRAY");
* * * *AI_StandUp(self);
* * * *AI_AlignToFP(self);
* *};
* *return LOOP_CONTINUE;
};

func void ZS_Pray_Sleeper_FP_End()
{
* *AI_PlayAni(self,"T_PRAY_2_STAND"); *
};

... ещё файл

// *********************
// Проповедь Ватраса
// *********************

// Функция инициализации состояния
func void ZS_Preach_Vatras()
{ *
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// запретить реакцию на тихие звуки
* *Npc_PercDisable(self,PERC_ASSESSQUIETSOUND);
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK); * * *
* *// движение на свой вайпоинт
* *AI_GotoWP(self,self.wp);
* *// выравняться
* *AI_AlignToWP(self);
};

// Функция цикла состояния
func int ZS_Preach_Vatras_loop()
{
* *// если прошло >= 13 сек
* *if(Npc_GetStateTime(self) >= 13)
* *{
* * * *// если кол-во произнесенных фраз > 20
* * * *if(self.aivar[AIV_TAPOSITION] > 20)
* * * *{
* * * * * *// начать с начала
* * * * * *self.aivar[AIV_TAPOSITION] = 0;
* * * *};
* * * *// чтение текста проповеди
* * * *B_Preach_Vatras(self.aivar[AIV_TAPOSITION]);
* * * *// переход на следующую фразу
* * * *self.aivar[AIV_TAPOSITION] = self.aivar[AIV_TAPOSITION] + 1; * * * *
* * * *// сброс времени состояния
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Preach_Vatras_end()
{
}; *

... ещё файл

// *********************
// Работа в поле
// *********************

// Функция инициализации состояния
func void ZS_Rake_FP()
{ *
* *// установить нормальный набор восприятий
* *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);
* *};
* *// если НПС не имеет мотыги
* *if(Npc_HasItems(self,ItMi_Rake) == 0)
* *{
* * * *// создать в инвентаре НПС мотыгу
* * * *CreateInvItem (self,ItMi_Rake);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};
* *
// Функция цикла состояния
func int ZS_Rake_FP_Loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"PICK"))
* *{ *
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *} *
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"PICK"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"PICK");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выравняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выравняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// работать мотыгой
* * * *AI_UseItemToState(self,ItMi_Rake,1); * *
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *}; *
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Rake_FP_End()
{
* *// прекратить использовать мотыгу
* *AI_UseItemToState(self,ItMi_Rake,-1);
};

Ответить с цитированием
Старый 30.04.2005, 13:36   #157
Vam

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

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

Ответить с цитированием
Старый 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);
};

Ответить с цитированием
Старый 04.05.2005, 13:34   #159
Vam

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

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

// ****************************************
// Использование наковальни (ковка оружия)
// ****************************************

// Функция инициализации состояния
func void ZS_Smith_Anvil()
{
* *// установить нормальный набор восприятий
* *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_Smith_Anvil_Loop()
{
* *// если действие с МОВом не прерываемо и наковальня имеется
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BSANVIL"))
* *{
* * * *// ковка оружия
* * * *AI_UseMob(self,"BSANVIL",1);
* *};
* *return LOOP_CONTINUE;
};

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

... ещё файл

// ****************************
// Закалка заготовки оружия
// ****************************

// Функция инициализации состояния
func void ZS_Smith_Cool()
{
* *// установить нормальный набор восприятий
* *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_Smith_Cool_Loop()
{
* *// если действие с МОВом не прерываемо и ванна с водой имеется
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BSCOOL"))
* *{
* * * *// закалка заготовки
* * * *AI_UseMob(self,"BSCOOL",1);
* *};
* *return LOOP_CONTINUE;
};

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

... ещё файл

// **********************************
// Разогрев заготовки оружия в горне
// **********************************

// Функция инициализации состояния
func void ZS_Smith_Fire()
{
* *// установить нормальный набор восприятий
* *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_Smith_Fire_Loop()
{
* *// если действие с МОВом не прерываемо и горн имеется
* *if(!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) && (Wld_IsMobAvailable(self,"BSFIRE"))
* *{
* * * *// разогрев заготовки
* * * *AI_UseMob(self,"BSFIRE",1);
* *};
* *return LOOP_CONTINUE;
};

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

... ещё файл

// *****************
// Заточка оружия
// *****************

// Функция инициализации состояния
func void ZS_Smith_Sharp()
{
* *// установить нормальный набор восприятий
* *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_Smith_Sharp_Loop()
{
* *// если действие с МОВом не прерываемо и точило имеется
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BSSHARP"))
* *{
* * * *// заточка
* * * *AI_UseMob(self,"BSSHARP",1);
* *};
* *return LOOP_CONTINUE;
};

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

... ещё файл

// ********************
// Курение болотника
// ********************

// Функция инициализации состояния
func void ZS_Smoke_Joint()
{
* *// установить нормальный набор восприятий
* *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);
* *};
* *// если НПС не имеет Обработанного болотника
* *if(Npc_HasItems(self,ItMi_Joint) == 0)
* *{
* * * *// создать в инвентаре НПС болотник
* * * *CreateInvItem(self,ItMi_Joint);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Smoke_Joint_loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"STAND"))
* *{
* * * *// выравнивание
* * * *Ai_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *} *
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выравняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выравняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// курить болотник
* * * *AI_UseItemToState(self,ItMi_JOINT,0);
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *}; * * * * *
* *// если прошло > 5 сек и НПС находится в режиме курения
* *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))
* *{
* * * *// анимация курения (дым)
* * * *AI_PlayAniBS(self,"T_JOINT_RANDOM_1",BS_ITEMINTER ACT);
* * * *// сброс времени цикла
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Smoke_Joint_end()
{
* *// прекратить курить
* *AI_UseItemToState(self,ItMi_Joint,-1);
};

... ещё файл

// *******************
// Курение кальяна
// *******************

// Функция инициализации состояния
func void ZS_Smoke_Waterpipe()
{
* *// установить нормальный набор восприятий
* *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_Smoke_Waterpipe_Loop()
{
* *// если действие с МОВом не прерываемо и кальян имеется
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"SMOKE"))
* *{
* * * *// курим кальян
* * * *AI_UseMob(self,"SMOKE",1);
* *};
* *return LOOP_CONTINUE;
};

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

... ещё файл

// ****************
// Игра с факелами
// ****************

// Функция инициализации состояния
func void ZS_Spit_Fire()
{
* *// установить нормальный набор восприятий
* *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);
* *};
* *// если НПС не имеет горящего факела
* *if(Npc_HasItems(self,ItLsTorchFirespit) == 0)
* *{
* * * *// создать в инвентаре НПС горящий факел
* * * *CreateInvItem(self,ItLsTorchFirespit);
* *};
};

// Функция цикла состояния
func int ZS_Spit_Fire_Loop()
{
* *// если фрипоинт существует и свободен
* *if(Wld_IsFPAvailable(self,"STAND"))
* *{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// выравняться
* * * *AI_ALignToFP(self);
* *}
* *else // фрипоинт занят
* *{
* * * *// выравняться на вайпоинте
* * * *AI_AlignToWP(self);
* *};
* *// если прошло > 10 сек
* *if(Npc_GetStateTime(self) > 10)
* *{
* * * *// использовать факел (5 фаза)
* * * *AI_UseItemToState(self,ItLsTorchFirespit,5);
* * * *// использовать факел (0 фаза)
* * * *AI_UseItemToState(self,ItLsTorchFirespit,0);
* * * *// сброс времени цикла
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Spit_Fire_end()
{
* *// оставить факел
* *AI_UseItemToState(self,ItLsTorchFirespit,-1);
};

Ответить с цитированием
Старый 05.05.2005, 16:31   #160
Vam

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

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

// **********************
// Стоять скрестив руки
// **********************

// Функция инициализации состояния
func void ZS_Stand_ArmsCrossed()
{
* *// установить нормальный набор восприятий
* *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);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Stand_ArmsCrossed_Loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"STAND"))
* *{ *
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *} *
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выравняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выравняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// встать
* * * *AI_StandUp(self);
* * * *// стоять скрестив руки (режим охраны)
* * * *AI_PlayAni(self,"T_STAND_2_LGUARD");
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *// если прошло > 5 сек и НПС находится в режиме охраны
* *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))
* *{
* * * *var int random;
* * * *random = Hlp_Random(7);
* * * *// случайная анимация движений
* * * *if(random == 0)
* * * *{
* * * * * *AI_PlayAni(self,"T_LGUARD_SCRATCH");
* * * *}
* * * *else if(random == 1)
* * * *{
* * * * * *AI_PlayAni(self,"T_LGUARD_STRETCH");
* * * *}
* * * *else if(random == 2)
* * * *{
* * * * * *AI_PlayAni(self,"T_LGUARD_CHANGELEG");
* * * *};
* * * *var int Eventrandy;
* * * *Eventrandy = Hlp_Random(200);
* * * *// с вероятностью 0.005 и если НПС в Яркендаре и Равен не убит и НПС не пират
* * * *if(Eventrandy == 1) && (CurrentLevel == ADDONWORLD_ZEN) && (RavenIsDead == FALSE) && (self.guild != GIL_PIR)
* * * *{
* * * * * *// проиграть эффект "Дрожь земли"
* * * * * *B_EVENT_PORTAL_EARTHQUAKE();
* * * *};
* * * *// сброс времени цикла
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Stand_ArmsCrossed_end()
{
* *// выйти из режима охраны
* *AI_PlayAni(self,"T_LGUARD_2_STAND"); * *
};

... ещё файл

// *****************************************
// Состояние ожидания Черных магов (Ищущие)
// *****************************************

// Функция инициализации состояния
func void ZS_Stand_Dementor()
{
* *// разрешить НПС все чувства
* *self.senses * * * * = SENSE_SEE ¦ SENSE_HEAR ¦ SENSE_SMELL; * *
* *// установить дальность чувств = макс. чувствительности монстров
* *self.senses_range * = PERC_DIST_MONSTER_ACTIVE_MAX; * * * *
* *
* *// если НПС имеет важную информацию
* *if(Npc_KnowsInfo(self,1))
* *{
* * * *// установить время реакции на восприятия 0.3 сек
* * * *Npc_SetPercTime(self,0.3);
* *}
* *else
* *{
* * * *// установить время реакции на восприятия 1 сек
* * * *Npc_SetPercTime(self,1);
* *};
* *// разрешить восприятие НПС на ГГ
* *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessPla yer);
* *// разрешить восприятие врага
* *Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnem y);
* *// разрешить восприятие магии
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// разрешить восприятие повреждений
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);
* *// если НПС особенный "Черный маг"
* *if(Hlp_GetInstanceID(self) != Hlp_GetInstanceID(DMT_1299_OberDementor_DI))
* *{
* * * *// разрешить восприятие звуков сражения
* * * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sFightSound);
* *};
* *// разрешить восприятие предупреждения
* *Npc_PercEnable(self,PERC_ASSESSWARN,B_AssessWarn) ;
* *// разрешить восприятие разговора
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;
* *// разрешить восприятие перемещения МОВа
* *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций
* *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Stand_Dementor_loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"STAND"))
* *{ *
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *} *
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выравняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выравняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// встать
* * * *AI_StandUp(self);
* * * *// анимация состояния охраны
* * * *AI_PlayAni(self,"T_STAND_2_LGUARD");
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Stand_Dementor_end()
{
* *// анимация прекращения действия
* *AI_PlayAni(self,"T_LGUARD_2_STAND"); * *
};

... ещё файл

// **********************
// Пить самогон стоя
// **********************

// Функция инициализации состояния
func void ZS_Stand_Drinking()
{
* *// установить нормальный набор восприятий
* *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);
* *};
* *// если НПС не имеет самогона
* *if(Npc_HasItems(self,ItFo_Booze) == 0)
* *{
* * * *// создать в инвентаре НПС бутылку самогона
* * * *CreateInvItem(self,ItFo_Booze);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Stand_Drinking_loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"STAND"))
* *{
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *}
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выравняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выравняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK )
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *}; *
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// пить самогон
* * * *AI_UseItemToState(self,ItFo_Booze,0);
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *// если прошло > 7 сек и НПС пьет самогон
* *if((Npc_GetStateTime(self) > 7) && (self.aivar[AIV_TAPOSITION] == ISINPOS))
* *{
* * * *var int random;
* * * *random = Hlp_Random(10);
* * * *// случайная анимация движений
* * * *if (random == 0)
* * * *{
* * * * * *// осмотреть бутылку
* * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_3",BS_ITEMINTE RACT);
* * * * * *// пить
* * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_1",BS_ITEMINTE RACT);
* * * *}
* * * *else if (random == 1)
* * * *{
* * * * * *// пить
* * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_1",BS_ITEMINTE RACT);
* * * * * *// утереть рот
* * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_2",BS_ITEMINTE RACT);
* * * *}
* * * *else
* * * *{
* * * * * *// пить
* * * * * *AI_PlayAniBS (self,"T_POTION_RANDOM_1",BS_ITEMINTERACT); //trinken
* * * *};
* * * *// сброс времени цикла
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Stand_Drinking_end ()
{
* *// прекратить пьянство
* *AI_UseItemToState(self,ItFo_Booze,-1);
};

... ещё файл

// **********************
// Употреблять пищу стоя
// **********************

// Функция инициализации состояния
func void ZS_Stand_Eating()
{
* *// установить нормальный набор восприятий
* *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);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* *var int random;
* *random = Hlp_Random(4);
* *// случайным образом создать в инвентаре один из предметов, если его нет * *
* *if(random == 0)
* *{
* * * *// Яблоко
* * * *if(Npc_HasItems (self,ItFo_Apple) == 0)
* * * *{
* * * * * *CreateInvItem(self,ItFo_Apple);
* * * *};
* * * *self.aivar[AIV_Food] = FOOD_Apple;
* *}
* *else if(random == 1)
* *{
* * * *// Сыр
* * * *if(Npc_HasItems(self,ItFo_Cheese) == 0)
* * * *{
* * * * * *CreateInvItem(self,ItFo_Cheese); * *
* * * *};
* * * *self.aivar[AIV_Food] = FOOD_Cheese;
* *}
* *else if(random == 2)
* *{
* * * *// Бекон
* * * *if(Npc_HasItems(self,ItFo_Bacon) == 0)
* * * *{
* * * * * *CreateInvItem(self,ItFo_Bacon);
* * * *}; *
* * * *self.aivar[AIV_Food] = FOOD_Bacon;
* *}
* *else if(random == 3) * *
* *{
* * * *// Жареное мясо
* * * *if(Npc_HasItems(self,ItFoMutton) == 0)
* * * *{
* * * * * *CreateInvItem(self,ItFoMutton);
* * * *}; *
* * * *self.aivar[AIV_Food] = FOOD_Bread;
* *}; *
};

// Функция цикла состояния
func int ZS_Stand_Eating_Loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"STAND"))
* *{ *
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if (self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *} *
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выравняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выравняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *}; *
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// если употребляем Яблоко
* * * *if(self.aivar[AIV_Food] == FOOD_Apple) *
* * * *{
* * * * * *// жевать Яблоко
* * * * * *AI_UseItemToState(self,ItFo_Apple,0);
* * * * * *// анимация
* * * * * *AI_PlayAniBS(self,"T_FOOD_RANDOM_2",BS_ITEMINTERA CT);
* * * * * *// установить флаг выполнения нужной функции
* * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* * * *}
* * * *// если употребляем Сыр
* * * *if(self.aivar[AIV_Food] == FOOD_Cheese) * *
* * * *{
* * * * * *// жевать Сыр
* * * * * *AI_UseItemToState(self,ItFo_Cheese,0);
* * * * * *// установить флаг выполнения нужной функции
* * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; *
* * * *}
* * * *// если употребляем Бекон
* * * *if(self.aivar[AIV_Food] == FOOD_Bacon)
* * * *{ *
* * * * * *// жевать Бекон
* * * * * *AI_UseItemToState(self,ItFo_Bacon,0);
* * * * * *// установить флаг выполнения нужной функции
* * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; *
* * * *}
* * * *// если употребляем Жареное мясо
* * * *if(self.aivar[AIV_Food] == FOOD_Bread)
* * * *{ *
* * * * * *// жевать Яблоко
* * * * * *AI_UseItemToState(self,ItFoMutton,0);
* * * * * *// установить флаг выполнения нужной функции
* * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; *
* * * *};
* *}; * * *
* *// если прошло > 5 сек и НПС жует
* *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))
* *{
* * * *// анимация жевания разной пищи
* * * *if(self.aivar[AIV_Food] == FOOD_Apple)
* * * *{
* * * * * *AI_PlayAniBS(self,"T_FOOD_RANDOM_1",BS_ITEMINTERA CT);
* * * *}
* * * *else if(self.aivar[AIV_Food] == FOOD_Bacon) ¦¦ (self.aivar[AIV_Food] == FOOD_Bread)
* * * *{
* * * * * *AI_PlayAniBS (self,"T_MEAT_RANDOM_1",BS_ITEMINTERACT);
* * * *}
* * * *else
* * * *{
* * * * * *AI_PlayAniBS (self,"T_FOODHUGE_RANDOM_1",BS_ITEMINTERACT);
* * * *};
* * * *// сброс времени цикла
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Stand_Eating_End ()
{
* *// прекратить анимацию
* *AI_PlayAniBS(self,"T_POTION_RANDOM_2",BS_ITEMINTE RACT);
* *// прекратить жевать пищу
* *if(self.aivar[AIV_Food] == FOOD_Apple) *{ AI_UseItemToState(self,ItFo_Apple,-1); };
* *if(self.aivar[AIV_Food] == FOOD_Cheese) { AI_UseItemToState(self,ItFo_Cheese,-1);};
* *if(self.aivar[AIV_Food] == FOOD_Bacon) *{ AI_UseItemToState(self,ItFo_Bacon,-1); };
* *if(self.aivar[AIV_Food] == FOOD_Bread) *{ AI_UseItemToState(self,ItFoMutton,-1); };
};


ЗЫ: Не забывайте про "прослойки", иногда чтобы выдать инфу приходиться ждать окончания суток.
Ответить с цитированием
Страница 4 из 8 1234 5678


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе

Смайлы Вкл.
[IMG] код Вкл.
HTML код Вкл.


Текущее время: 11:40. Часовой пояс GMT +4.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot

AGFC: Valley of Gothic © 2004-2022

Яндекс.Метрика