Re: Уроки скриптологии
// ************************************************** ***********************<br>// Обработчик состояния комментирования подставной гильдии (переодетого ГГ)<br>// -------------------------------------------------------------------------<br>// self - НПС источник информации, other - НПС приемник информации (обычно ГГ)<br>// ************************************************** ***********************<br><br>func void ZS_CommentFakeGuild()<br>{<br> * *// разрешить минимальный набор восприятий<br> * *Perception_Set_Minimal();<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// если НПС не сидит<br> * *if(!C_BodystateContains(self,BS_SIT))<br> * *{ * <br> * * * *// НПС поворачивается к ГГ<br> * * * *B_TurnToNpc(self,other);<br> * *};<br> * *// если ГГ не сидит<br> * *if(!C_BodystateContains(other,BS_SIT))<br> * *{ * <br> * * * *// ГГ поворачивается к НПС<br> * * * *B_TurnToNpc(other,self);<br> * * * *// если расстояние между ГГ и НПС < 80 см<br> * * * *if(Npc_GetDistToNpc(other,self) < 80) <br> * * * *{<br> * * * * * *// ГГ делает шаг назад<br> * * * * * *AI_Dodge(other);<br> * * * *};<br> * *};<br> * *// если на ГГ одеты доспехи<br> * *if(Npc_HasEquippedArmor(other) == TRUE)<br> * *{<br> * * * *var C_Item itm; <br> * * * *// получить ссылку на доспехи<br> * * * *itm = Npc_GetEquippedArmor(other); *<br> * * * *// если НПС милиционер или паладин<br> * * * *if(self.guild == GIL_MIL ¦¦ self.guild == GIL_PAL)<br> * * * *{<br> * * * * * *// НПС говорит ГГ (SVM фраза "Ты солдат! Одевайся соответственно.")<br> * * * * * *B_Say (self,other, "$ADDON_WRONGARMOR_MIL");<br> * * * *}<br> * * * *// иначе, если НПС маг послушник или маг огня<br> * * * *else if(self.guild == GIL_NOV ¦¦ self.guild == GIL_KDF)<br> * * * *{<br> * * * * * *// НПС говорит ГГ (SVM фраза "Эта одежда не соответствует нашему ордену. Переоденься.")<br> * * * * * *B_Say(self,other,"$ADDON_WRONGARMOR_KDF" ;);<br> * * * *}<br> * * * *// иначе, если НПС наемник или охотник на драконов<br> * * * *else if(self.guild == GIL_SLD ¦¦ self.guild == GIL_DJG)<br> * * * *{<br> * * * * * *// НПС говорит ГГ (SVM фраза "В каком виде ты тут бродишь? Одень что-то приличное.")<br> * * * * * *B_Say(self,other,"$ADDON_WRONGARMOR_SLD" ;);<br> * * * *}<br> * * * *else // иначе (другие гильдии)<br> * * * *{<br> * * * * * *// НПС говорит ГГ (SVM фраза "Это не твоя одежда. Я с тобой не буду говорить.")<br> * * * * * *B_Say(self,other,"$ADDON_WRONGARMOR");< br> * * * *}; *<br> * *}<br> * *else // иначе (ГГ без доспехов)<br> * *{<br> * * * *// если НПС бандит<br> * * * *if(self.guild == GIL_BDT)<br> * * * *{<br> * * * * * *// НПС говорит ГГ (SVM фраза "Да на тебе даже кольчуги нет. Проваливай!")<br> * * * * * *B_Say(self,other,"$ADDON_NOARMOR_BDT"); <br> * * * *};<br> * *};<br>};<br><br>... иеще файл<br><br>// **************************************<br>// Функция подготовки НПС боеприпасов<br>// **************************************<br><br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf - экипируемый НПС<br>// ======================================<br><br>func void B_CreateAmmo(var C_NPC slf)<br>{<br> * *var C_ITEM rangedWeapon;<br> * *// если НПС находится в боевом режиме с оружием дальнего радиуса поражения<br> * *if(Npc_IsInFightMode(slf,FMODE_FAR))<br> * *{<br> * * * *// получить оружие, которое НПС держит в руках<br> * * * *rangedWeapon = Npc_GetReadiedWeapon(slf);<br> * *}<br> * *// иначе, если НПС экипирован оружием дальнего радиуса поражения<br> * *else if(Npc_HasEquippedRangedWeapon(slf))<br> * *{<br> * * * *// получить оружие дальнего радиуса поражения, которым экипирован НПС<br> * * * *rangedWeapon = Npc_GetEquippedRangedWeapon(slf);<br> * *}<br> * *else // иначе<br> * *{<br> * * * *return;<br> * *};<br> * *// если боезапас - Стрела<br> * *if(rangedWeapon.munition == ItRw_Arrow)<br> * *{<br> * * * *// если у НПС < 10 стрел<br> * * * *if(Npc_HasItems(slf,ItRw_Arrow) < 10)<br> * * * *{<br> * * * * * *// создать в инвентаре НПС 10 стрел<br> * * * * * *CreateInvItems(slf,ItRw_Arrow,10);<br> * * * *};<br> * *}<br> * *// иначе, если боезапас - Болт<br> * *else if(rangedWeapon.munition == ItRw_Bolt)<br> * *{<br> * * * *// если у НПС < 10 болтов<br> * * * *if(Npc_HasItems(slf,ItRw_Bolt) < 10)<br> * * * *{<br> * * * * * *// создать в инвентаре НПС 10 болтов<br> * * * * * *CreateInvItems(slf,ItRw_Bolt,10);<br> * * * *};<br> * *}; *<br>};<br><br>... и еще<br><br>// **************************************<br>// Функция добивания НПС<br>// **************************************<br><br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf *- НПС агрессор<br>// oth *- НПС жертва<br>// ======================================<br><br>func void B_FinishingMove(var C_NPC slf,var C_Npc oth)<br>{<br> * *// если агрессор не находится в режиме сражения с оружием ближнего радиуса поражения<br> * *if(!Npc_IsInFightMode(slf,FMODE_MELEE))<br> * *{<br> * * * *// агрессор ставится в режим сражения с оружием Ржавый меч<br> * * * *Npc_SetToFightMode(slf,ItMw_1h_MISC_Sword);<br> * *};<br> * *// агрессор добивает жертву<br> * *AI_FinishingMove (slf, oth);<br>};<br><br>... и еще<br><br>// ********************************<br>// НПС перестает смотреть на цель<br>// ********************************<br><br>// ================================<br>// Аргументы:<br>// --------------------------------<br>// slf *- смотрящий НПС<br>// ================================<br><br>func void B_StopLookAt(var C_NPC slf)<br>{<br> * *var C_NPC target;<br> * *// получить цель, на которую смотрит НПС<br> * *target = Npc_GetLookAtTarget(slf);<br> * *// если цель существует<br> * *if(Hlp_IsValidNpc(target))<br> * *{<br> * * * *// НПС перестает смотреть на цель<br> * * * *AI_StopLookAt (slf);<br> * *};<br>};<br><br>// ***************************<br>// НПС смотрит на другого НПС<br>// ***************************<br><br>// ===========================<br>// Аргументы:<br>// ---------------------------<br>// slf *- смотрящий НПС<br>// oth *- НПС цель<br>// ===========================<br><br>func void B_LookAtNpc(var C_NPC slf,var C_NPC oth)<br>{<br> * *// НПС перестает смотреть на старую цель<br> * *B_StopLookAt(slf);<br> * *// НПС смотрит на новую цель<br> * *AI_LookAtNpc(slf,oth);<br>};<br><br>// **************************************<br>// НПС поворачивается к другому НПС<br>// **************************************<br><br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf *- поворачивающийся НПС<br>// oth *- НПС цель<br>// ======================================<br><br>func void B_TurnToNpc(var C_NPC slf,var C_Npc oth)<br>{<br> * *// НПС поворачивается к цели<br> * *AI_TurnToNpc(slf,oth);<br>};<br><br>... и еще<br><br>// *********************************<br>// Перевод НПС в исходное состояние<br>// *********************************<br><br>// ================================<br>// Аргументы:<br>// --------------------------------<br>// slf *- НПС, переводимый в исходное состояние<br>// ================================<br><br>func void B_ResetAll(var C_NPC slf)<br>{<br> * *// НПС перестает смотреть на цель<br> * *B_StopLookAt(slf);<br> * *// НПС прячет оружие<br> * *AI_RemoveWeapon(slf);<br>};<br><br>... и еще<br><br>// *******************************<br>// НПС говорит SVM фразу<br>// *******************************<br><br>// ===============================<br>// Аргументы:<br>// -------------------------------<br>// slf *- говорящий НПС<br>// oth *- слушающий НПС<br>// text - имя переменной класса C_SVM, которая содержит произносимую фразу (должно начинаться с символа $)<br>// ===============================<br><br>func void B_Say(var C_NPC slf,var C_Npc oth,var string text)<br>{<br> * *// НПС говорит другому НПС SVM (Standart Voice Module) фразу<br> * *AI_OutputSVM(slf,oth,text);<br>};<br><br><br>Функция B_RemoveWeapon нигде не вызывается и файл B_RemoveWeapon.d может быть удален.<br>
|
Re: Уроки скриптологии
// ******************************<br>// Комментарий завершенной атаки<br>// ------------------------------<br>// self - агрессор, other - жертва<br>// ******************************<br><br>func void B_Say_AttackEnd()<br>{<br> * *// если агрессор атаковал врага или монстра, убившего человека<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_GuildEnemy) ¦¦ (self.aivar[AIV_ATTACKREASON] == AR_MonsterMurderedHuman)<br> * *{<br> * * * *// если жертва человек<br> * * * *if(other.guild < GIL_SEPERATOR_HUM)<br> * * * *{<br> * * * * * *// если жертва не убита<br> * * * * * *if(!Npc_IsDead(other))<br> * * * * * *{<br> * * * * * * * *// если последняя атакованная цель и есть жертва<br> * * * * * * * *if(self.aivar[AIV_LASTTARGET] == Hlp_GetInstanceID(other))<br> * * * * * * * *{<br> * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Умри, подлец!"<br> * * * * * * * * * *B_Say(self,other,"$KILLENEMY");<br> * * * * * * * *}<br> * * * * * * * *else // иначе<br> * * * * * * * *{<br> * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Да, убей эту свинью!"<br> * * * * * * * * * *B_Say(self,other,"$GOODKILL");<br> * * * * * * * *};<br> * * * * * *}<br> * * * * * *else // иначе (жертва мертва)<br> * * * * * *{<br> * * * * * * * *// агрессор говорит жертве (SVM фраза) "Ты это заслужил, подлец!"<br> * * * * * * * *B_Say(self,other,"$ENEMYKILLED");<br> * * * * * *};<br> * * * *}<br> * * * *else // иначе (жертва монстр)<br> * * * *{<br> * * * * * *// если агрессор член партии ГГ<br> * * * * * *if(self.aivar[AIV_PARTYMEMBER] == TRUE)<br> * * * * * *{<br> * * * * * * * *var int rnd;<br> * * * * * * * *rnd = Hlp_Random(100);<br> * * * * * * * *// если вероятность 0.85 и жертва не дракон<br> * * * * * * * *if(rnd > 15) && (other.guild != GIL_DRAGON)<br> * * * * * * * *{<br> * * * * * * * * * *return;<br> * * * * * * * *};<br> * * * * * *};<br> * * * * * *// если жертва убита не ГГ<br> * * * * * *if(other.aivar[AIV_KilledByPlayer] == FALSE)<br> * * * * * *{<br> * * * * * * * *// если агрессор имеет номер голоса 9<br> * * * * * * * *if(self.voice == 9)<br> * * * * * * * *{<br> * * * * * * * * * *var int random;<br> * * * * * * * * * *random = Hlp_Random(2);<br> * * * * * * * * * *// если вероятность 0.5<br> * * * * * * * * * *if(random == 0) <br> * * * * * * * * * *{<br> * * * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "С тобой покончено, скотина!"<br> * * * * * * * * * * * *B_Say(self,other,"$ADDON_MONSTERKILLED" );<br> * * * * * * * * * *}<br> * * * * * * * * * *else<br> * * * * * * * * * *{<br> * * * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "На ОДНУ тварь меньше."<br> * * * * * * * * * * * *B_Say(self,other,"$ADDON_MONSTERKILLED2" ;);<br> * * * * * * * * * *};<br> * * * * * * * *}<br> * * * * * * * *// тначе, если агрессор имеет номер голоса 12<br> * * * * * * * *else if(self.voice == 12)<br> * * * * * * * *{<br> * * * * * * * * * *// если агрессор Горн<br> * * * * * * * * * *if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(GornOW)) * * * * * // в Рудниковой долине<br> * * * * * * * * * *¦¦ (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(GornDJG)) * * * * *// охотник на драконов<br> * * * * * * * * * *¦¦ (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(GornNW_vor_DJG)) * // охотник на драконов в лагере наемников<br> * * * * * * * * * *¦¦ (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(GornNW_nach_DJG)) *// охотник на драконов в 6 главе<br> * * * * * * * * * *¦¦ (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Gorn_DI))) * * * * // на острове драконов<br> * * * * * * * * * *{<br> * * * * * * * * * * * *var int randy;<br> * * * * * * * * * * * *randy = Hlp_Random(2);<br> * * * * * * * * * * * *// если вероятность 0.5<br> * * * * * * * * * * * *if(randy == 0) <br> * * * * * * * * * * * *{<br> * * * * * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "С тобой покончено, скотина!"<br> * * * * * * * * * * * * * *B_Say(self,other,"$ADDON_MONSTERKILLED" );<br> * * * * * * * * * * * *}<br> * * * * * * * * * * * *else<br> * * * * * * * * * * * *{<br> * * * * * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Одной тварью меньше!"<br> * * * * * * * * * * * * * *B_Say (self,other,"$MONSTERKILLED");<br> * * * * * * * * * * * *};<br> * * * * * * * * * *}<br> * * * * * * * * * *else<br> * * * * * * * * * *{<br> * * * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "С тобой покончено, скотина!"<br> * * * * * * * * * * * *B_Say(self,other,"$ADDON_MONSTERKILLED" );<br> * * * * * * * * * *};<br> * * * * * * * *}<br> * * * * * * * *else // другие голоса<br> * * * * * * * *{<br> * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Одной тварью меньше!"<br> * * * * * * * * * *B_Say(self,other,"$MONSTERKILLED");<br> * * * * * * * *};<br> * * * * * *}<br> * * * * * *else // иначе (жертва убита ГГ)<br> * * * * * *{<br> * * * * * * * *// ГГ говорит жертве (SVM фраза) "Хорошая работа - одной тварью меньше!"<br> * * * * * * * *B_Say(self,other,"$GOODMONSTERKILL"); * * * <br> * * * * * *};<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если агрессор атаковал вора<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_Theft)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "И не пытайся больше обокрасть меня!"<br> * * * *B_Say(self,other,"$THIEFDOWN");<br> * * * *return;<br> * *};<br> * *// агрессор атаковал ГГ, вскрывшего его сундук<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_UseMob)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "В следующий раз не советую тебе шарить по чужим вещам!"<br> * * * *B_Say(self,other,"$RUMFUMMLERDOWN");<br > * * * *return;<br> * *};<br> * *// если агрессор атаковал убийцу овец<br> * *if (self.aivar[AIV_ATTACKREASON] == AR_SheepKiller)<br> * *{<br> * * * *// если жертва человек<br> * * * *if(other.guild < GIL_SEPERATOR_HUM)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "Никогда больше не делай этого! Это же наши овцы!"<br> * * * * * *B_Say(self,other,"$SHEEPATTACKERDOWN"); <br> * * * *}<br> * * * *else // иначе (жертва монстр)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "Одной тварью меньше!"<br> * * * * * *B_Say(self,other,"$MONSTERKILLED");<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если агрессор атаковал человека, убившего другого человека<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman)<br> * *{<br> * * * *// если жертва не убита<br> * * * *if(!Npc_IsDead(other))<br> * * * *{<br> * * * * * *// если последняя атакованная цель и есть жертва<br> * * * * * *if(self.aivar[AIV_LASTTARGET] == Hlp_GetInstanceID(other))<br> * * * * * *{<br> * * * * * * * *// агрессор говорит жертве (SVM фраза) "Умри, убийца!"<br> * * * * * * * *B_Say(self,other,"$KILLMURDERER");<br> * * * * * *}<br> * * * * * *else // иначе<br> * * * * * *{<br> * * * * * * * *// агрессор говорит жертве (SVM фраза) "Да, убей эту свинью!"<br> * * * * * * * *B_Say(self,other,"$GOODKILL");<br> * * * * * *};<br> * * * *}<br> * * * *else // иначе (жертва убита)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "Ты это заслужил, подлец!"<br> * * * * * *B_Say(self,other,"$ENEMYKILLED");<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если агрессор помогает убить монстра<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_MonsterVsHuman)<br> * *{<br> * * * *// если голос агрессора 9 или 12<br> * * * *if(self.voice == 9) ¦¦ (self.voice == 12)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "С тобой покончено, скотина!"<br> * * * * * *B_Say(self,other,"$ADDON_MONSTERKILLED" );<br> * * * *}<br> * * * *else // иначе (другие голоса)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "Одной тварью меньше!"<br> * * * * * *B_Say(self,other,"$MONSTERKILLED");<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если охрана ворот атакует монстра<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_MonsterCloseToGate)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Тупоголовая скотина!"<br> * * * *B_Say(self,other,"$STUPIDBEASTKILLED"); <br> * * * *return;<br> * *};<br> * *// если агрессор реагировал на повреждение (на него напали первым)<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_ReactToDamage)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Больше никогда не спорь со мной!"<br> * * * *B_Say(self,other,"$NEVERHITMEAGAIN");<b r> * * * *return;<br> * *};<br> * *// если агрессор реагировал на обнаженное оружие<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_ReactToWeapon)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Это будет тебе уроком!"<br> * * * *B_Say(self,other,"$YOUBETTERSHOULDHAVELISTEN ED");<br> * * * *return;<br> * *};<br> * *// если агрессор реагировал на вход в его помещение или вызвана охраны для защиты помещения<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_ClearRoom) ¦¦ (self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToRoom)<br> * *{<br> * * * *// если ГГ находится в помещении, принадлежащем агрессору<br> * * * *if(C_NpcIsBotheredByPlayerRoomGuild(self))<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "А теперь убирайся отсюда!"<br> * * * * * *B_Say(self,other,"$GETUPANDBEGONE");<br > * * * *}<br> * * * *else // иначе (вне помещения)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "И чтоб я больше тебя здесь не видел!"<br> * * * * * *B_Say(self,other,"$NEVERENTERROOMAGAIN" );<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если причина атаки - ГГ в помещении с ограниченным доступом<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_LeftPortalRoom)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "И чтоб я больше тебя здесь не видел!"<br> * * * *B_Say(self,other,"$NEVERENTERROOMAGAIN" );<br> * * * *return;<br> * *};<br> * *// если охрана ворот атакует незваного гостя<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_GuardStopsIntruder)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Умри, подлец!"<br> * * * *B_Say(self,other,"$KILLENEMY");<br> * * * *return;<br> * *};<br> * *// если охрана прекратила атаковать преступника<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_GuardStopsFight)<br> * *{<br> * * * *// если жертва наемник или охотник на драконов<br> * * * *if(other.guild == GIL_SLD) ¦¦ (other.guild == GIL_DJG)<br> * * * *{<br> * * * * * *// молчат<br> * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "Борьбы здесь не будет, ясно!? Заруби это себе на носу!"<br> * * * * * *B_Say(self,other,"$THEREISNOFIGHTINGHERE&quo t;);<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если вызвана охрана по факту воровства<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToThief)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "В следующий раз не советую тебе шарить по чужим вещам!"<br> * * * *B_Say(self,other,"$RUMFUMMLERDOWN");<br > * * * *return;<br> * *};<br> * *return;<br>};<br><br>
|
Re: Уроки скриптологии
// ********************************<br>// Комментарий причины атаки<br>// --------------------------------<br>// self - агрессор, other - жертва<br>// ********************************<br><br>func void B_Say_AttackReason()<br>{<br> * *// если гильдии агрессора и жертвы не враждебны и жертва враждебна агрессору<br> * *if(Wld_GetGuildAttitude(self.guild,other.guild) != ATT_HOSTILE) && (Npc_GetAttitude(self,other) == ATT_HOSTILE)<br> * *{<br> * * * *// если причина атаки - убийство ГГ НПС<br> * * * *if(self.aivar[AIV_ATTACKREASON] == AR_KILL)<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * * * *// агрессор говорит жертве (SVM фраза) "Я тебя сейчас убью!"<br> * * * *B_Say_Overlay(self,other,"$IGETYOUSTILL" ;);<br> * * * *return;<br> * *};<br> * *// если жертва враг гильдии агрессора<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_GuildEnemy)<br> * *{<br> * * * *// если агрессор член партии ГГ<br> * * * *if(self.aivar[AIV_PARTYMEMBER] == TRUE)<br> * * * *{<br> * * * * * *var int rnd;<br> * * * * * *rnd = Hlp_Random(100);<br> * * * * * *// если вероятность 0.85<br> * * * * * *if(rnd > 15)<br> * * * * * *{<br> * * * * * * * *return;<br> * * * * * *};<br> * * * *};<br> * * * *// если жертва человек<br> * * * *if(other.guild < GIL_SEPERATOR_HUM)<br> * * * *{<br> * * * * * *// если ГГ переодетый бандит<br> * * * * * *if(C_PlayerIsFakeBandit(self,other) == TRUE)<br> * * * * * *{<br> * * * * * * * *// агрессор говорит жертве (SVM фраза) "Умри, грязный бандюга!"<br> * * * * * * * *B_Say_Overlay(self,other,"$ADDON_DIEBANDIT&q uot;); * * * * * <br> * * * * * * * *// агрессор посылает восприятие нападения<br> * * * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * * * *}<br> * * * * * *// иначе, если ГГ переодетый пират<br> * * * * * *else if(C_PlayerIsFakePirate(self,other) == TRUE)<br> * * * * * *{<br> * * * * * * * *// агрессор говорит жертве (SVM фраза) "Я тебя прикончу, Пират!"<br> * * * * * * * *B_Say_Overlay (self,other, "$ADDON_DIRTYPIRATE");<br> * * * * * * * *// агрессор посылает восприятие нападения<br> * * * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * * * *}<br> * * * * * *else // иначе<br> * * * * * *{<br> * * * * * * * *// агрессор говорит жертве (SVM фраза) "Теперь твоя очередь!"<br> * * * * * * * *B_Say_Overlay(self,other,"$DIEENEMY");< br> * * * * * * * *// агрессор посылает восприятие нападения<br> * * * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * * * *};<br> * * * *}<br> * * * *else // иначе (жертва монстр)<br> * * * *{<br> * * * * * *// если голос агрессора 9<br> * * * * * *if(self.voice == 9)<br> * * * * * *{ * <br> * * * * * * * *var int random;<br> * * * * * * * *random = Hlp_Random(3);<br> * * * * * * * *if(random < 1) <br> * * * * * * * *{<br> * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Тут снова крутится одна из этих тварей!"<br> * * * * * * * * * *B_Say_Overlay(self,other,"$DIEMONSTER") ; * *<br> * * * * * * * *}<br> * * * * * * * *else if(random == 1) <br> * * * * * * * *{<br> * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Снова одна из этих тварей!"<br> * * * * * * * * * *B_Say_Overlay(self,other,"$ADDON_DIEMONSTER& quot;); *<br> * * * * * * * *}<br> * * * * * * * *else <br> * * * * * * * *{<br> * * * * * * * * * *// агрессор говорит жертве (SVM фраза) "Вот опять одна из тварюг!"<br> * * * * * * * * * *B_Say_Overlay(self,other,"$ADDON_DIEMONSTER2 "); <br> * * * * * * * *};<br> * * * * * *}<br> * * * * * *else // иначе (другие голоса)<br> * * * * * *{<br> * * * * * * * *// агрессор говорит жертве (SVM фраза) "Тут снова крутится одна из этих тварей!"<br> * * * * * * * *B_Say_Overlay(self,other,"$DIEMONSTER") ;<br> * * * * * *};<br> * * * * * *// агрессор посылает восприятие нападения<br> * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * *};<br> * * * *return;<br> * *};<br> * *// если агрессор атакует вора<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_Theft)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Погоди у меня, гадкий воришка!"<br> * * * *B_Say_Overlay(self,other,"$DIRTYTHIEF") ;<br> * * * *return;<br> * *};<br> * *// если агрессор атакует грабителя сундуков<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_UseMob)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Руки прочь!"<br> * * * *B_Say_Overlay(self,other,"$HANDSOFF");< br> * * * *return;<br> * *};<br> * *// если агрессор атакует убийцу овец<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_SheepKiller)<br> * *{<br> * * * *// если жертва человек<br> * * * *if(other.guild < GIL_SEPERATOR_HUM)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "Этот подлец убивает наших овец!"<br> * * * * * *B_Say_Overlay(self,other,"$SHEEPKILLER" );<br> * * * *}<br> * * * *else // иначе (жертва монстр)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "Эта проклятая тварь сжирает наших овец!"<br> * * * * * *B_Say_Overlay(self,other,"$SHEEPKILLERMONSTE R");<br> * * * *};<br> * * * *return;<br> * *};<br> * *<br> * *// если агрессор атакует человека, убившего человека<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Убийца!"<br> * * * *B_Say_Overlay(self,other,"$YOUMURDERER" );<br> * * * *// агрессор посылает восприятие нападения<br> * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * *return;<br> * *};<br> * *// если агрессор атакует монстра, убившего человека<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_MonsterMurderedHuman)<br> * *{<br> * * * *// нет комментариев<br> * * * *return;<br> * *};<br> * *// если агрессор помогает убить монстра<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_MonsterVsHuman)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Тут снова крутится одна из этих тварей!"<br> * * * *B_Say_Overlay(self,other,"$DIEMONSTER") ;<br> * * * *// агрессор посылает восприятие нападения<br> * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other);<br> * * * *return;<br> * *};<br> * *// если охрана ворот атакует монстра<br> * *if (self.aivar[AIV_ATTACKREASON] == AR_MonsterCloseToGate)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Тут не пройдет ни одна тварь!"<br> * * * *B_Say_Overlay(self,other,"$DIESTUPIDBEAST&qu ot;);<br> * * * *return;<br> * *};<br> * *// если на агрессора напали<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_ReactToDamage)<br> * *{<br> * * * *// напавший монстр<br> * * * *if(other.guild > GIL_SEPERATOR_HUM)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "Ты получил, что хотел!"<br> * * * * * *B_Say_Overlay(self,other,"$YOUASKEDFORIT&quo t;);<br> * * * * * *return;<br> * * * *}<br> * * * *else // иначе (человек)<br> * * * *{<br> * * * * * *// агрессор говорит жертве (SVM фраза) "Ты у меня дождешься, подлец!"<br> * * * * * *B_Say_Overlay(self,other,"$YOUDAREHITME" ;);<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *// если агрессор среагировал нп обнаженное оружие<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_ReactToWeapon)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Ты получил, что хотел!"<br> * * * *B_Say_Overlay(self,other,"$YOUASKEDFORIT&quo t;);<br> * * * *return;<br> * *};<br> * *// если агрессор реагировал на вход в его помещение<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_ClearRoom)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Тогда я должен тебя поколотить!"<br> * * * *B_Say_Overlay(self,other,"$THENIBEATYOUOUTOF HERE");<br> * * * *return;<br> * *};<br> * *// если причина атаки - ГГ в помещении с ограниченным доступом<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_LeftPortalRoom)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Чего это ты там ищешь, ей!"<br> * * * *B_Say_Overlay(self,other,"$WHATDIDYOUDOINTHE RE");<br> * * * *return;<br> * *};<br> * *// если охрана прекратила атаковать преступника<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_GuardStopsFight)<br> * *{<br> * * * *// агрессор говорит жертве (SVM фраза) "Вы хотите с этим покончить по-хорошему?!"<br> * * * *B_Say_Overlay(self,other,"$WILLYOUSTOPFIGHTI NG");<br> * * * *return;<br> * *};<br> * *// если вызвана охрана по факту воровства<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToThief)<br> * *{<br> * * * *return;<br> * *};<br> * *// если вызвана охраны для защиты помещения<br> * *if(self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToRoom)<br> * *{<br> * * * *return;<br> * *};<br> * *return;<br>};<br><br><br>Функция B_Say_FleeReason нигде не вызывается и файл B_Say_FleeReason.d может быть удален.<br>
|
Re: Уроки скриптологии
2Vam: <br>[q]Когда выйдет вторая часть, и кто её оформит, пока сказать не могу.[/q]<br>Вот-с, поработал тут слегка, добавил новое и оптимизировал старое + обновил дизайн :)<br>Ссылка та же: http://gothic3.allgothic.ru/filezzz/Vam_tutor.rar (60Кб)<br>Для тех, кто не понял, это все "Уроки скриптологии", собранные в одном HTML-файле :D :D :D<br><br>З.Ы. 2Vam:<br>Тебя там всё устраивает? ::)<br>
|
Re: Уроки скриптологии
2Vam: <br>Почему уроки прекратились? Что-то случилось? ::)<br><br>2basilio58: <br>
Цитата:
|
Re: Уроки скриптологии
// ************************************************** ************<br>// НПС slf называет НПС oth сумму денежного выражения goldAmount<br>// ************************************************** ************<br><br>func void B_Say_Gold(var C_NPC slf,var C_NPC oth,var int goldAmount)<br>{<br> * *if(goldAmount == 1000) *{ B_Say(slf,oth,"$GOLD_1000"); *};<br> * *if(goldAmount == 950) * { B_Say(slf,oth,"$GOLD_950"); * };<br> * *if(goldAmount == 900) * { B_Say(slf,oth,"$GOLD_900"); * };<br> * *if(goldAmount == 850) * { B_Say(slf,oth,"$GOLD_850"); * };<br> * *if(goldAmount == 800) * { B_Say(slf,oth,"$GOLD_800"); * };<br> * *if(goldAmount == 750) * { B_Say(slf,oth,"$GOLD_750"); * };<br> * *if(goldAmount == 700) * { B_Say(slf,oth,"$GOLD_700"); * };<br> * *if(goldAmount == 650) * { B_Say(slf,oth,"$GOLD_650"); * };<br> * *if(goldAmount == 600) * { B_Say(slf,oth,"$GOLD_600"); * };<br> * *if(goldAmount == 550) * { B_Say(slf,oth,"$GOLD_550"); * };<br> * *if(goldAmount == 500) * { B_Say(slf,oth,"$GOLD_500"); * };<br> * *if(goldAmount == 450) * { B_Say(slf,oth,"$GOLD_450"); * };<br> * *if(goldAmount == 400) * { B_Say(slf,oth,"$GOLD_400"); * };<br> * *if(goldAmount == 350) * { B_Say(slf,oth,"$GOLD_350"); * };<br> * *if(goldAmount == 300) * { B_Say(slf,oth,"$GOLD_300"); * };<br> * *if(goldAmount == 250) * { B_Say(slf,oth,"$GOLD_250"); * };<br> * *if(goldAmount == 200) * { B_Say(slf,oth,"$GOLD_200"); * };<br> * *if(goldAmount == 150) * { B_Say(slf,oth,"$GOLD_150"); * };<br> * *if(goldAmount == 100) * { B_Say(slf,oth,"$GOLD_100"); * };<br> * *if(goldAmount == 90) * *{ B_Say(slf,oth,"$GOLD_90"); * *};<br> * *if(goldAmount == 80) * *{ B_Say(slf,oth,"$GOLD_80"); * *};<br> * *if(goldAmount == 70) * *{ B_Say(slf,oth,"$GOLD_70"); * *};<br> * *if(goldAmount == 60) * *{ B_Say(slf,oth,"$GOLD_60"); * *};<br> * *if(goldAmount == 50) * *{ B_Say(slf,oth,"$GOLD_50"); * *};<br> * *if(goldAmount == 40) * *{ B_Say(slf,oth,"$GOLD_40"); * *};<br> * *if(goldAmount == 30) * *{ B_Say(slf,oth,"$GOLD_30"); * *};<br> * *if(goldAmount == 20) * *{ B_Say(slf,oth,"$GOLD_20"); * *};<br> * *if(goldAmount == 10) * *{ B_Say(slf,oth,"$GOLD_10"); * *};<br>};<br><br>... еще файл<br><br>// *******************************<br>// НПС slf преветствует НПС oth<br>// *******************************<br><br>func void B_Say_GuildGreetings(var C_NPC slf,var C_NPC oth)<br>{<br> * *// если милиция приветствует милицию или паладина<br> * *if(slf.guild == GIL_MIL) && ((oth.guild == GIL_MIL) ¦¦ (oth.guild == GIL_PAL))<br> * *{<br> * * * *// звучит SVM фраза "За короля!"<br> * * * *B_Say_Overlay(slf,oth,"$MILGREETINGS"); <br> * * * *return;<br> * *};<br> * *// если паладин приветствует паладина или милицию или магов огня<br> * *if(slf.guild == GIL_PAL) && ((oth.guild == GIL_PAL) ¦¦ (oth.guild == GIL_MIL) ¦¦ (oth.guild == GIL_KDF))<br> * *{<br> * * * *// звучит SVM фраза "За Инноса!"<br> * * * *B_Say_Overlay (slf,oth,"$PALGREETINGS");<br> * * * *return;<br> * *};<br> * *// если маг огня приветствует паладина или мага послушника или мага огня<br> * *if(slf.guild == GIL_KDF) && ((oth.guild == GIL_PAL) ¦¦ (oth.guild == GIL_NOV) ¦¦ (oth.guild == GIL_KDF))<br> * *{<br> * * * *// звучит SVM фраза "За Инноса!"<br> * * * *B_Say_Overlay (slf,oth,"$PALGREETINGS");<br> * * * *return;<br> * *};<br> * *// если приветствующий Барток и он сообщал об одиноком орке перед Хоринисом<br> * *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Bartok)) && (Bartok_OrkGesagt == TRUE)<br> * *{<br> * * * *// Барток говорит об одиноком орке перед Хоринисом<br> * * * *B_Bartok_ShitAnOrc();<br> * * * *return;<br> * *};<br> * *// если приветствующий Кок<br> * *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Koch))<br> * *{<br> * * * *// Кок говорит о топоре<br> * * * *B_Koch_Hackebeil();<br> * * * *return;<br> * *};<br> * *var int zufall;<br> * *zufall = Hlp_Random(100); <br> * *// с вероятностью 0.1 и если идет дождь<br> * *if((zufall <= 10) && Wld_IsRaining())<br> * *{<br> * * * *// звучит SVM фраза "Ну и скверная же погода!"<br> * * * *B_Say_Overlay(slf,oth,"$WEATHER");<br> * * * *return;<br> * * * *<br> * *};<br>};<br><br>... и ещё<br><br>// ************************************************<b r>// *Мини реплики НПС<br>// ************************************************<b r><br>func void B_Say_Smalltalk()<br>{<br> * *var int random;<br> * *random = Hlp_Random (120);<br> * *var int Choice;<br> * *Choice = Hlp_Random(1);<br> * *// с вероятностью 0.04<br> * *if(random < 5)<br> * *{<br> * * * *// НПС произносит SVM фразу "... ты, правда, так думаешь..."<br> * * * *B_Say(self,self,"$SMALLTALK01");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 10)<br> * *{<br> * * * *// НПС произносит SVM фразу "... все возможно..."<br> * * * *B_Say(self,self,"$SMALLTALK02");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 15)<br> * *{<br> * * * *// НПС произносит SVM фразу "... он должен больше знать об этом..."<br> * * * *B_Say(self,self,"$SMALLTALK03");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 20)<br> * *{<br> * * * *// НПС произносит SVM фразу "... как будто у меня и так мало проблем..."<br> * * * *B_Say(self,self,"$SMALLTALK04");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 25)<br> * *{<br> * * * *// НПС произносит SVM фразу "... кто мог рассказать такое..."<br> * * * *B_Say(self,self,"$SMALLTALK05");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 30)<br> * *{<br> * * * *// НПС произносит SVM фразу "... все же я еще очень зол..."<br> * * * *B_Say(self,self,"$SMALLTALK06");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 35)<br> * *{<br> * * * *// НПС произносит SVM фразу "... кое-что болтают..."<br> * * * *B_Say(self,self,"$SMALLTALK07");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 40)<br> * *{<br> * * * *// НПС произносит SVM фразу "... я бы не делал этого..."<br> * * * *B_Say(self,self,"$SMALLTALK08");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 45)<br> * *{<br> * * * *// НПС произносит SVM фразу "... это всего лишь запах..."<br> * * * *B_Say(self,self,"$SMALLTALK09");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 50)<br> * *{<br> * * * *// НПС произносит SVM фразу "... нужно узнать, что они там замышляют..."<br> * * * *B_Say(self,self,"$SMALLTALK10");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 55)<br> * *{<br> * * * *// НПС произносит SVM фразу "... а я тебе что говорил..."<br> * * * *B_Say(self,self,"$SMALLTALK11");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 60)<br> * *{<br> * * * *// НПС произносит SVM фразу "... меня никто не спрашивал..."<br> * * * *B_Say(self,self,"$SMALLTALK12");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 65)<br> * *{<br> * * * *// НПС произносит SVM фразу "... бедный малый может и обидеть кого-нибудь..."<br> * * * *B_Say(self,self,"$SMALLTALK13");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 70)<br> * *{<br> * * * *// НПС произносит SVM фразу "... ничего нового..."<br> * * * *B_Say(self,self,"$SMALLTALK14");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 75)<br> * *{<br> * * * *// НПС произносит SVM фразу "... все ясно..."<br> * * * *B_Say(self,self,"$SMALLTALK15");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 80)<br> * *{<br> * * * *// НПС произносит SVM фразу "... меня не нужно спрашивать..."<br> * * * *B_Say(self,self,"$SMALLTALK16");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 85)<br> * *{<br> * * * *// НПС произносит SVM фразу "... так не может дальше продолжаться..."<br> * * * *B_Say(self,self,"$SMALLTALK17");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 90)<br> * *{<br> * * * *// НПС произносит SVM фразу "... мое мнение ты уже знаешь..."<br> * * * *B_Say(self,self,"$SMALLTALK18");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 95)<br> * *{<br> * * * *// НПС произносит SVM фразу "... я сказал то же самое..."<br> * * * *B_Say(self,self,"$SMALLTALK19");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 100)<br> * *{<br> * * * *// НПС произносит SVM фразу "... вряд ли что-нибудь изменится из-за этого..."<br> * * * *B_Say(self,self,"$SMALLTALK20");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 105)<br> * *{<br> * * * *// НПС произносит SVM фразу "... почему я узнаю об этом только сейчас..."<br> * * * *B_Say(self,self,"$SMALLTALK21");<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 110)<br> * *{<br> * * * *// если НПС маг послушник или паладин или маг огня<br> * * * *if(Npc_GetTrueGuild(self) == GIL_NOV) ¦¦ (Npc_GetTrueGuild(self) == GIL_PAL) ¦¦ (Npc_GetTrueGuild(self) == GIL_KDF)<br> * * * *{<br> * * * * * *// с вероятностью 0.5<br> * * * * * *if(Choice == 0)<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... так написано в священных книгах..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK28");<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... давайте посмотрим, что из этого выйдет..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK22");<br> * * * * * *};<br> * * * *}<br> * * * *// если НПС бандит или наемник или охотник на драконов или пират<br> * * * *else if(Npc_GetTrueGuild(self) == GIL_BDT) ¦¦ (Npc_GetTrueGuild(self) == GIL_SLD) ¦¦ (Npc_GetTrueGuild(self) == GIL_DJG)<br> * * * *¦¦ *(Npc_GetTrueGuild(self) == GIL_PIR)<br> * * * *{<br> * * * * * *// с вероятностью 0.5<br> * * * * * *if(Choice == 0)<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... он был пьянючий..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK25");<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... давайте посмотрим, что из этого выйдет..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK22");<br> * * * * * *};<br> * * * *}<br> * * * *else // остальные гильдии<br> * * * *{<br> * * * * * *// НПС произносит SVM фразу "... давайте посмотрим, что из этого выйдет..."<br> * * * * * *B_Say(self,self,"$SMALLTALK22");<br> * * * *}; *<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random < 115)<br> * *{<br> * * * *// если НПС маг послушник или паладин или маг огня<br> * * * *if(Npc_GetTrueGuild(self) == GIL_NOV) ¦¦ (Npc_GetTrueGuild(self) == GIL_PAL) ¦¦ (Npc_GetTrueGuild(self) == GIL_KDF)<br> * * * *{<br> * * * * * *// с вероятностью 0.5<br> * * * * * *if(Choice == 0)<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... я действую по приказу Инноса..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK29");<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... некоторые проблемы решаются сами собой..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK23");<br> * * * * * *};<br> * * * *}<br> * * * *// если НПС бандит или наемник или охотник на драконов или пират<br> * * * *else if(Npc_GetTrueGuild(self) == GIL_BDT) ¦¦ (Npc_GetTrueGuild(self) == GIL_SLD) ¦¦ (Npc_GetTrueGuild(self) == GIL_DJG)<br> * * * *¦¦ (Npc_GetTrueGuild(self) == GIL_PIR)<br> * * * *{<br> * * * * * *// с вероятностью 0.5<br> * * * * * *if(Choice == 0)<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... со мной бы этот номер не прошел..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK26");<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... некоторые проблемы решаются сами собой..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK23");<br> * * * * * *};<br> * * * *}<br> * * * *else // остальные гильдии<br> * * * *{<br> * * * * * *// НПС произносит SVM фразу "... некоторые проблемы решаются сами собой..."<br> * * * * * *B_Say(self,self,"$SMALLTALK23");<br> * * * *}; *<br> * *}<br> * *// с вероятностью 0.04<br> * *else if(random <= 120)<br> * *{ * * * <br> * * * *// если НПС маг послушник или паладин или маг огня<br> * * * *if(Npc_GetTrueGuild(self) == GIL_NOV) ¦¦ (Npc_GetTrueGuild(self) == GIL_PAL) ¦¦ (Npc_GetTrueGuild(self) == GIL_KDF)<br> * * * *{<br> * * * * * *// с вероятностью 0.5<br> * * * * * *if(Choice == 0)<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... никому не позволено нарушать указания богов..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK30");<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... я не могу больше это слушать..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK24");<br> * * * * * *};<br> * * * *}<br> * * * *// если НПС бандит или наемник или охотник на драконов или пират<br> * * * *else if(Npc_GetTrueGuild(self) == GIL_BDT) ¦¦ (Npc_GetTrueGuild(self) == GIL_SLD) ¦¦ (Npc_GetTrueGuild(self) == GIL_DJG)<br> * * * *¦¦ (Npc_GetTrueGuild (self) == GIL_PIR)<br> * * * *{<br> * * * * * *// с вероятностью 0.5<br> * * * * * *if(Choice == 0)<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... все убежали словно зайцы, я остался один..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK27");<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// НПС произносит SVM фразу "... я не могу больше это слушать..."<br> * * * * * * * *B_Say(self,self,"$SMALLTALK24");<br> * * * * * *};<br> * * * *}<br> * * * *else // остальные гильдии<br> * * * *{<br> * * * * * *// НПС произносит SVM фразу "... я не могу больше это слушать..."<br> * * * * * *B_Say(self,self,"$SMALLTALK24");<br> * * * *}; *<br> * *};<br>};<br><br>... и ещё<br><br>// ************************************************** **************<br>// НПС slf произносит для НПС oth быструю SVM фразу text<br>// ----------------------------------------------------------------<br>// От B_Say() отличается только тем, что следующие AI команды будут<br>// выполняться не ожидая окончания фразы <br>// ************************************************** **************<br><br>func void B_Say_Overlay(var C_NPC slf,var C_Npc oth,var string text)<br>{<br> * *AI_OutputSVM_Overlay(slf,oth,text);<br>};<br><br>
|
Re: Уроки скриптологии
Файл обновлён.<br>(Типа прослойка ::) )
|
Re: Уроки скриптологии
// *******************************************<br>// Выбор НПС оружия соответствующего цели<br>// *******************************************<br><br >// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf *- НПС агрессор<br>// oth *- НПС цель<br>// ======================================<br><br>func void B_SelectWeapon(var C_NPC slf,var C_NPC oth)<br>{<br> * *// если агрессор падает или плывет или ныряет<br> * *if(C_BodyStateContains(slf,BS_FALL)) ¦¦ (C_BodyStateContains(slf,BS_SWIM)) ¦¦ (C_BodyStateContains(slf,BS_DIVE))<br> * *{<br> * * * *return;<br> * *};<br> * *// если агрессор выбрал для использования магию<br> * *if(B_SelectSpell(slf,oth))<br> * *{<br> * * * *return;<br> * *};<br> * *// если агрессор находится в режиме сражения магией<br> * *if(Npc_IsInFightMode(slf,FMODE_MAGIC))<br> * *{<br> * * * *// если агрессор находится в боевом режиме (Примечание: не мой взгляд этот блок лишний, была проверка, что НПС использует магию)<br> * * * *if(!Npc_IsInFightMode(slf,FMODE_NONE))<br> * * * *{<br> * * * * * *// агрессор прячет оружие<br> * * * * * *AI_RemoveWeapon(slf);<br> * * * *};<br> * * * *// подготовка оружия ближнего радиуса поражения к бою<br> * * * *AI_ReadyMeleeWeapon (slf);<br> * * * *return;<br> * *};<br> * *// если агрессор находится в режиме сражения оружием дальнего радиуса поражения<br> * *if(Npc_IsInFightMode(slf,FMODE_FAR))<br> * *{<br> * * * *// если расстояние от агрессора до цели > дистанции, ближе которой НПС выбирает оружие ближнего радиуса поражения или агрессор не экипирован оружием ближнего радиуса поражения<br> * * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) ¦¦ (!Npc_HasEquippedMeleeWeapon(slf))<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *// если агрессор находится в режиме сражения оружием ближнего радиуса поражения<br> * *if(Npc_IsInFightMode(slf,FMODE_MELEE))<br> * *{<br> * * * *// если расстояние от агрессора до цели > дистанции, дальше которой НПС выбирает оружие дальнего радиуса поражения или агрессор не экипирован оружием дальнего радиуса поражения<br> * * * *if(Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER) ¦¦ (!Npc_HasEquippedRangedWeapon(slf))<br> * * * *{<br> * * * * * *return;<br> * * * *};<br> * *};<br> * *// если агрессор экипирован оружием ближнего радиуса поражения и расстояние от агрессора до цели <= дистанции, дальше которой НПС выбирает оружие дальнего радиуса поражения<br> * *if(Npc_HasEquippedMeleeWeapon(slf)) && (Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER)<br> * *{<br> * * * *// если агрессор находится в боевом режиме<br> * * * *if(!Npc_IsInFightMode(slf,FMODE_NONE))<br> * * * *{<br> * * * * * *// агрессор прячет оружие<br> * * * * * *AI_RemoveWeapon(slf);<br> * * * *};<br> * * * *// подготовка оружия ближнего радиуса поражения к бою<br> * * * *AI_ReadyMeleeWeapon (slf);<br> * * * *return;<br> * *};<br> * *// если агрессор экипирован оружием дальнего радиуса поражения и расстояние от агрессора до цели > дистанции, ближе которой НПС выбирает оружие ближнего радиуса поражения и причина атаки агрессора - убийство жертвы<br> * *if(Npc_HasEquippedRangedWeapon(slf)) && (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) && (C_NpcHasAttackReasonToKill(slf))<br> * *{<br> * * * *// если агрессор находится в боевом режиме<br> * * * *if(!Npc_IsInFightMode(slf,FMODE_NONE))<br> * * * *{<br> * * * * * *// агрессор прячет оружие<br> * * * * * *AI_RemoveWeapon(slf);<br> * * * *};<br> * * * *// подготовка оружия дальнего радиуса поражения к бою<br> * * * *AI_ReadyRangedWeapon(slf);<br> * * * *return;<br> * *};<br> * *// если агрессор не в боевом режиме<br> * *if(Npc_IsInFightMode(slf,FMODE_NONE))<br> * *{<br> * * * *// если агрессор экипирован оружием ближнего радиуса поражения<br> * * * *if(Npc_HasEquippedMeleeWeapon(slf))<br> * * * *{<br> * * * * * *// подготовка оружия к бою<br> * * * * * *AI_ReadyMeleeWeapon(slf);<br> * * * * * *return;<br> * * * *};<br> * * * *// если агрессор экипирован оружием дальнего радиуса поражения<br> * * * *if(Npc_HasEquippedRangedWeapon(slf))<br> * * * *{<br> * * * * * *// подготовка оружия к бою<br> * * * * * *AI_ReadyRangedWeapon(slf);<br> * * * * * *return;<br> * * * *};<br> * * * *// подготовка к бою кулаками<br> * * * *AI_ReadyMeleeWeapon(slf);<br> * * * *return;<br> * *};<br> * *return;<br>};<br><br>... еще файл<br><br>// *********************************<br>// Устанавливает отношение НПС к ГГ<br>// *********************************<br><br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf *- НПС<br>// att *- отношение<br>// ======================================<br><br>func void B_SetAttitude(var C_NPC slf,var int att)<br>{<br> * *// установить временное отношение НПС к ГГ<br> * *Npc_SetAttitude(slf,att);<br> * *// установить постояное отношение НПС к ГГ<br> * *Npc_SetTempAttitude(slf,att);<br>};<br><br>... и ещё<br><br>// ********************************************<br>// Инициализация переменной other для НПС self<br>// ********************************************<br><b r>func void B_ValidateOther() <br>{<br> * *// если other отсутсвует (загрузка игры)<br> * *if(!Hlp_IsValidNpc(other))<br> * *{ * <br> * * * *// other = последней цели НПС<br> * * * *other = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]);<br> * * * *// для НПС установить цель other<br> * * * *Npc_SetTarget(self,other);<br> * * * *// установить флаг загрузки игры<br> * * * *self.aivar[AIV_LOADGAME] = TRUE;<br> * *}<br> * *else // иначе (other существует)<br> * *{ * <br> * * * *// повторно инициализировать other целью<br> * * * *Npc_GetTarget(self);<br> * * * *// сохранить последнюю цель<br> * * * *self.aivar[AIV_LASTTARGET] = Hlp_GetInstanceID(other);<br> * * * *// сброс флага загрузки игры<br> * * * *self.aivar[AIV_LOADGAME] = FALSE;<br> * *};<br>};<br><br><br><br>Добавление от 03/26/05, в 09:56:59 <hr class="hr_agfc">Криминал ГГ<br><br>// *******************************<br>// Запоминание новостей<br>// *******************************<br><br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf - НПС, запоминающий новость<br>// taeter - НПС преступник<br>// crime - криминальная новость<br>// ======================================<br><br>func void B_MemorizePlayerCrime(var C_NPC slf,var C_NPC taeter,var int crime)<br>{ <br> // если преступник не ГГ<br> if(!Npc_IsPlayer(taeter))<br> {<br> return;<br> };<br> // если НПС черный маг<br> if(slf.guild == GIL_DMT)<br> {<br> return;<br> };<br> // если новость более значима чем предыдущие новости<br> if(crime > B_GetPlayerCrime(slf)) <br> {<br> // удалить предыдущую новость<br> B_DeletePetzCrime(slf);<br> // добавить новость<br> B_AddPetzCrime(slf,crime);<br> };<br> // если новость одного порядка с предыдущей новостью (Примечание: можно оставить ==, > было ранее)<br> if(crime >= B_GetPlayerCrime(slf))<br> {<br> // НПС запоминает новость<br> slf.aivar[AIV_NpcSawPlayerCommit] = crime;<br> // НПС запоминает день преступления<br> slf.aivar[AIV_NpcSawPlayerCommitDay] = Wld_GetDay();<br> // НПС запоминает уровень криминала ГГ<br> slf.aivar[AIV_CrimeAbsolutionLevel] = B_GetCurrentAbsolutionLevel(slf);<br> };<br>};<br><br>... и ещё файл<br><br>// ************************************************** **********<br>// Получить последнюю новость, запомненную НПС о криминале ГГ<br>// ************************************************** **********<br><br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf - НПС имеющий новость<br>// --------------------------------------<br>// Возвращаемое значение: последняя запомненная новость<br>// ======================================<br><br>func int B_GetPlayerCrime(var C_NPC slf)<br>{<br> // если уровень криминала ГГ меньше воровства<br> if(slf.aivar[AIV_NpcSawPlayerCommit] <= CRIME_ATTACK)<br> {<br> // если с момента запоминания новости прошло более двух дней<br> if(slf.aivar[AIV_NpcSawPlayerCommitDay] < (Wld_GetDay()-2))<br> {<br> // криминала не было<br> return CRIME_NONE;<br> };<br> };<br> // если уровень криминала, запомненный НПС, < уровня криминала ГГ по локациям<br> if(slf.aivar[AIV_CrimeAbsolutionLevel] < B_GetCurrentAbsolutionLevel(slf))<br> {<br> // криминала не было<br> return CRIME_NONE;<br> };<br> // последний запомненный криминал<br> return slf.aivar[AIV_NpcSawPlayerCommit];<br>};<br><br>... и ещё<br><br>// ************************************************** <br>// Добавить новость для соответствующей локации<br>// ************************************************** <br><br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf - НПС свидетель, проживающий в локации<br>// crime - криминальная новость<br>// ======================================<br><br>func void B_AddPetzCrime(var C_NPC slf,var int crime)<br>{<br> // если НПС из Миненталя<br> if(C_NpcBelongsToOldCamp(slf))<br> {<br> // если убийство<br> if(crime == CRIME_MURDER)<br> {<br> // увеличить счетчик убийств<br> PETZCOUNTER_OldCamp_Murder = PETZCOUNTER_OldCamp_Murder + 1;<br> };<br> // если воровство<br> if(crime == CRIME_THEFT)<br> {<br> // увеличить счетчик воровства<br> PETZCOUNTER_OldCamp_Theft = PETZCOUNTER_OldCamp_Theft + 1;<br> };<br> // если нападение<br> if(crime == CRIME_ATTACK)<br> {<br> // увеличить счетчик нападений<br> PETZCOUNTER_OldCamp_Attack = PETZCOUNTER_OldCamp_Attack + 1;<br> };<br> // если убийство овец<br> if(crime == CRIME_SHEEPKILLER)<br> {<br> // увеличить счетчик убитых овец<br> PETZCOUNTER_OldCamp_Sheepkiller = PETZCOUNTER_OldCamp_Sheepkiller + 1;<br> };<br> };<br> // если НПС из Хориниса<br> if(C_NpcBelongsToCity(slf))<br> {<br> if(crime == CRIME_MURDER)<br> {<br> PETZCOUNTER_City_Murder = PETZCOUNTER_City_Murder + 1;<br> };<br> if(crime == CRIME_THEFT)<br> {<br> PETZCOUNTER_City_Theft = PETZCOUNTER_City_Theft + 1;<br> };<br> if(crime == CRIME_ATTACK)<br> {<br> PETZCOUNTER_City_Attack = PETZCOUNTER_City_Attack + 1;<br> };<br> if(crime == CRIME_SHEEPKILLER)<br> {<br> PETZCOUNTER_City_Sheepkiller = PETZCOUNTER_City_Sheepkiller + 1;<br> };<br> };<br> // если НПС из Монастыря<br> if(C_NpcBelongsToMonastery(slf))<br> {<br> if(crime == CRIME_MURDER)<br> {<br> PETZCOUNTER_Monastery_Murder = PETZCOUNTER_Monastery_Murder + 1;<br> };<br> if(crime == CRIME_THEFT)<br> {<br> PETZCOUNTER_Monastery_Theft = PETZCOUNTER_Monastery_Theft + 1;<br> };<br> if(crime == CRIME_ATTACK)<br> {<br> PETZCOUNTER_Monastery_Attack = PETZCOUNTER_Monastery_Attack + 1;<br> };<br> if(crime == CRIME_SHEEPKILLER)<br> {<br> PETZCOUNTER_Monastery_Sheepkiller = PETZCOUNTER_Monastery_Sheepkiller + 1;<br> };<br> };<br> // если НПС с Фермы наемников<br> if(C_NpcBelongsToFarm(slf))<br> {<br> if(crime == CRIME_MURDER)<br> {<br> PETZCOUNTER_Farm_Murder = PETZCOUNTER_Farm_Murder + 1;<br> };<br> if(crime == CRIME_THEFT)<br> {<br> PETZCOUNTER_Farm_Theft = PETZCOUNTER_Farm_Theft + 1;<br> };<br> if(crime == CRIME_ATTACK)<br> {<br> PETZCOUNTER_Farm_Attack = PETZCOUNTER_Farm_Attack + 1;<br> };<br> if(crime == CRIME_SHEEPKILLER)<br> {<br> PETZCOUNTER_Farm_Sheepkiller = PETZCOUNTER_Farm_Sheepkiller + 1;<br> };<br> };<br> // если НПС из Лагеря бандитов<br> if(C_NpcBelongsToBL(slf))<br> {<br> if(crime == CRIME_MURDER)<br> {<br> PETZCOUNTER_BL_Murder = PETZCOUNTER_BL_Murder + 1;<br> };<br> if(crime == CRIME_THEFT)<br> {<br> PETZCOUNTER_BL_Theft = PETZCOUNTER_BL_Theft + 1;<br> };<br> if(crime == CRIME_ATTACK)<br> {<br> PETZCOUNTER_BL_Attack = PETZCOUNTER_BL_Attack + 1;<br> };<br> };<br>};<br><br>... и ещё<br><br>// ************************************************** ***********<br>// Удалить новость для соответствующей локации<br>// ************************************************** ***********<br><br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf - НПС свидетель, проживающий в локации<br>// ======================================<br><br>func void B_DeletePetzCrime(var C_NPC slf)<br>{<br> // если НПС из Миненталя<br> if(C_NpcBelongsToOldCamp(slf))<br> {<br> // если последняя запомненная новость - убийство<br> if(B_GetPlayerCrime(slf) == CRIME_MURDER)<br> {<br> // уменьшить счетчик убийств<br> PETZCOUNTER_OldCamp_Murder = PETZCOUNTER_OldCamp_Murder - 1;<br> };<br> // если последняя запомненная новость - воровство<br> if(B_GetPlayerCrime(slf) == CRIME_THEFT)<br> {<br> // уменьшить счетчик воровства<br> PETZCOUNTER_OldCamp_Theft = PETZCOUNTER_OldCamp_Theft - 1;<br> };<br> // если последняя запомненная новость - нападение<br> if(B_GetPlayerCrime(slf) == CRIME_ATTACK)<br> {<br> // уменьшить счетчик нападений<br> PETZCOUNTER_OldCamp_Attack = PETZCOUNTER_OldCamp_Attack - 1;<br> };<br> // если последняя запомненная новость - убийство овец<br> if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)<br> {<br> // уменьшить счетчик убитых овец<br> PETZCOUNTER_OldCamp_Sheepkiller = PETZCOUNTER_OldCamp_Sheepkiller - 1;<br> };<br> };<br> // если НПС из Хориниса<br> if(C_NpcBelongsToCity(slf))<br> {<br> if(B_GetPlayerCrime(slf) == CRIME_MURDER)<br> {<br> PETZCOUNTER_City_Murder = PETZCOUNTER_City_Murder - 1;<br> };<br> if(B_GetPlayerCrime(slf) == CRIME_THEFT)<br> {<br> PETZCOUNTER_City_Theft = PETZCOUNTER_City_Theft - 1;<br> };<br> if(B_GetPlayerCrime(slf) == CRIME_ATTACK)<br> {<br> PETZCOUNTER_City_Attack = PETZCOUNTER_City_Attack - 1;<br> };<br> if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)<br> {<br> PETZCOUNTER_City_Sheepkiller = PETZCOUNTER_City_Sheepkiller - 1;<br> };<br> };<br> // если НПС из Монастыря<br> if(C_NpcBelongsToMonastery(slf))<br> {<br> if(B_GetPlayerCrime(slf) == CRIME_MURDER)<br> {<br> PETZCOUNTER_Monastery_Murder = PETZCOUNTER_Monastery_Murder - 1;<br> };<br> if(B_GetPlayerCrime(slf) == CRIME_THEFT)<br> {<br> PETZCOUNTER_Monastery_Theft = PETZCOUNTER_Monastery_Theft - 1;<br> };<br> if(B_GetPlayerCrime(slf) == CRIME_ATTACK)<br> {<br> PETZCOUNTER_Monastery_Attack = PETZCOUNTER_Monastery_Attack - 1;<br> };<br> if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)<br> {<br> PETZCOUNTER_Monastery_Sheepkiller = PETZCOUNTER_Monastery_Sheepkiller - 1;<br> };<br> };<br> // если НПС с Фермы наемников<br> if(C_NpcBelongsToFarm(slf))<br> {<br> if(B_GetPlayerCrime(slf) == CRIME_MURDER)<br> {<br> PETZCOUNTER_Farm_Murder = PETZCOUNTER_Farm_Murder - 1;<br> };<br> if(B_GetPlayerCrime(slf) == CRIME_THEFT)<br> {<br> PETZCOUNTER_Farm_Theft = PETZCOUNTER_Farm_Theft - 1;<br> };<br> if(B_GetPlayerCrime(slf) == CRIME_ATTACK)<br> {<br> PETZCOUNTER_Farm_Attack = PETZCOUNTER_Farm_Attack - 1;<br> };<br> if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER)<br> {<br> PETZCOUNTER_Farm_Sheepkiller = PETZCOUNTER_Farm_Sheepkiller - 1;<br> };<br> };<br> // если НПС из Лагеря бандитов<br> if(C_NpcBelongsToBL(slf))<br> {<br> if(B_GetPlayerCrime(slf) == CRIME_MURDER)<br> {<br> PETZCOUNTER_BL_Murder = PETZCOUNTER_BL_Murder - 1;<br> };<br> if(B_GetPlayerCrime(slf) == CRIME_THEFT)<br> {<br> PETZCOUNTER_BL_Theft = PETZCOUNTER_BL_Theft - 1;<br> };<br> if(B_GetPlayerCrime(slf) == CRIME_ATTACK)<br> {<br> PETZCOUNTER_BL_Attack = PETZCOUNTER_BL_Attack - 1;<br> };<br> };<br>};<br><br><br><br>Добавление от 03/26/05, в 10:01:09 <hr class="hr_agfc">2DimaD:<br>
Цитата:
|
Re: Уроки скриптологии
// *************************************************< br>// Подсчет абсолютного уровня криминала по локациям<br>// *************************************************< br><br>func void B_GrantAbsolution(var int location)<br>{<br> * *// если Миненталь или все локации<br> * *if(location == LOC_OLDCAMP) ¦¦ (location == LOC_ALL)<br> * *{<br> * * * *// абсолютный уровень по локации++<br> * * * *ABSOLUTIONLEVEL_OldCamp = ABSOLUTIONLEVEL_OldCamp + 1;<br> * * * *// сброс счетчиков криминала по локации<br> * * * *PETZCOUNTER_OldCamp_Murder * * *= 0;<br> * * * *PETZCOUNTER_OldCamp_Theft * * * = 0;<br> * * * *PETZCOUNTER_OldCamp_Attack * * *= 0;<br> * * * *PETZCOUNTER_OldCamp_Sheepkiller = 0;<br> * *};<br> * *// если Хоринис или все локации<br> * *if(location == LOC_CITY) ¦¦ (location == LOC_ALL)<br> * *{<br> * * * *ABSOLUTIONLEVEL_City = ABSOLUTIONLEVEL_City + 1;<br> * * * *PETZCOUNTER_City_Murder * * * * = 0;<br> * * * *PETZCOUNTER_City_Theft * * * * *= 0;<br> * * * *PETZCOUNTER_City_Attack * * * * = 0;<br> * * * *PETZCOUNTER_City_Sheepkiller * *= 0;<br> * *};<br> * *// если Монастырь или все локации<br> * *if(location == LOC_MONASTERY) ¦¦ (location == LOC_ALL)<br> * *{<br> * * * *ABSOLUTIONLEVEL_Monastery = ABSOLUTIONLEVEL_Monastery + 1;<br> * * * *PETZCOUNTER_Monastery_Murder * * * *= 0;<br> * * * *PETZCOUNTER_Monastery_Theft * * * * = 0; * * * *<br> * * * *PETZCOUNTER_Monastery_Attack * * * *= 0;<br> * * * *PETZCOUNTER_Monastery_Sheepkiller * = 0;<br> * *};<br> * *// если Ферма наемников или все локации<br> * *if(location == LOC_FARM) ¦¦ (location == LOC_ALL)<br> * *{<br> * * * *ABSOLUTIONLEVEL_Farm = ABSOLUTIONLEVEL_Farm + 1;<br> * * * *PETZCOUNTER_Farm_Murder * * * * = 0;<br> * * * *PETZCOUNTER_Farm_Theft * * * * *= 0;<br> * * * *PETZCOUNTER_Farm_Attack * * * * = 0;<br> * * * *PETZCOUNTER_Farm_Sheepkiller * *= 0;<br> * *};<br> * *// если Лагерь бандитов<br> * *if(location == LOC_BL)<br> * *{<br> * * * *ABSOLUTIONLEVEL_BL = ABSOLUTIONLEVEL_BL + 1;<br> * * * *PETZCOUNTER_BL_Murder * * * * * = 0;<br> * * * *PETZCOUNTER_BL_Theft * * * * * *= 0;<br> * * * *PETZCOUNTER_BL_Attack * * * * * = 0;<br> * *};<br>};<br><br>... ещё файл<br><br>// ************************************************** *********************<br>// Получить абсолютный уровень криминала для локации<br>// ************************************************** *********************<br><br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf - НПС, проживающий в локации<br>// --------------------------------------<br>// Возвращаемое значение - абсолютный уровень криминала<br>// ======================================<br><br>func int B_GetCurrentAbsolutionLevel(var C_NPC slf)<br>{<br> * *// если НПС из Миненталя<br> * *if(C_NpcBelongsToOldCamp(slf))<br> * *{<br> * * * *return ABSOLUTIONLEVEL_OldCamp; * * * * <br> * *};<br> * *// если НПС из Хориниса<br> * *if(C_NpcBelongsToCity(slf))<br> * *{<br> * * * *return ABSOLUTIONLEVEL_City; * * * * * *<br> * *};<br> * *// если НПС из Монастыря<br> * *if(C_NpcBelongsToMonastery(slf))<br> * *{<br> * * * *return ABSOLUTIONLEVEL_Monastery; * * * <br> * *};<br> * *// если НПС с Фермы наемников<br> * *if(C_NpcBelongsToFarm(slf))<br> * *{<br> * * * *return ABSOLUTIONLEVEL_Farm;<br> * *};<br> * *// если НПС из Лагеря бандитов<br> * *if(C_NpcBelongsToBL(slf))<br> * *{<br> * * * *return ABSOLUTIONLEVEL_BL;<br> * *};<br> * *return 0;<br>};<br><br>... и ещё<br><br>// *************************************************< br>// Получить суммарный уровень криминала по локациям<br>// *************************************************< br><br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf - НПС, проживающий в локации<br>// --------------------------------------<br>// Возвращаемое значение - суммарный уровень криминала ГГ для локации<br>// ======================================<br><br>func int B_GetTotalPetzCounter(var C_NPC slf)<br>{<br> * *// если НПС из Миненталя<br> * *if (C_NpcBelongsToOldCamp(slf))<br> * *{<br> * * * *// суммарный уровень криминала для локации<br> * * * *return (PETZCOUNTER_OldCamp_Murder + PETZCOUNTER_OldCamp_Theft + PETZCOUNTER_OldCamp_Attack + PETZCOUNTER_OldCamp_Sheepkiller);<br> * *};<br> * *// если НПС из Хориниса<br> * *if (C_NpcBelongsToCity(slf))<br> * *{<br> * * * *return (PETZCOUNTER_City_Murder + PETZCOUNTER_City_Theft + PETZCOUNTER_City_Attack + PETZCOUNTER_City_Sheepkiller);<br> * *};<br> * *// если НПС из Монастыря<br> * *if (C_NpcBelongsToMonastery(slf))<br> * *{<br> * * * *return (PETZCOUNTER_Monastery_Murder + PETZCOUNTER_Monastery_Theft + PETZCOUNTER_Monastery_Attack + PETZCOUNTER_Monastery_Sheepkiller);<br> * *};<br> * *// если НПС с Фермы наемников<br> * *if (C_NpcBelongsToFarm(slf))<br> * *{<br> * * * *return (PETZCOUNTER_Farm_Murder + PETZCOUNTER_Farm_Theft + PETZCOUNTER_Farm_Attack + PETZCOUNTER_Farm_Sheepkiller);<br> * *};<br> * *// если НПС из Лагеря бандитов<br> * *if (C_NpcBelongsToBL(slf))<br> * *{<br> * * * *return (PETZCOUNTER_BL_Murder + PETZCOUNTER_BL_Theft + PETZCOUNTER_BL_Attack); <br> * *};<br> * *return 0;<br>};<br><br>... и еще<br><br>// ************************************************** *******<br>// Получить криминал ГГ по локациям и в порядке приоритетов<br>// ************************************************** *******<br><br>// ======================================<br>// Аргументы:<br>// --------------------------------------<br>// slf - НПС, проживающий в локации<br>// --------------------------------------<br>// Возвращаемое значение - приоритетный криминал для локации<br>// ======================================<br><br>func int B_GetGreatestPetzCrime(var C_NPC slf)<br>{<br> * *// если НПС из Миненталя<br> * *if(C_NpcBelongsToOldCamp(slf))<br> * *{<br> * * * *// если счетчик убийств > 0<br> * * * *if(PETZCOUNTER_OldCamp_Murder > 0)<br> * * * *{<br> * * * * * *// криминал - убийство<br> * * * * * *return CRIME_MURDER;<br> * * * *};<br> * * * *// если счетчик воровства > 0<br> * * * *if(PETZCOUNTER_OldCamp_Theft > 0)<br> * * * *{<br> * * * * * *// криминал - воровство<br> * * * * * *return CRIME_THEFT;<br> * * * *};<br> * * * *// если счетчик нападений > 0<br> * * * *if(PETZCOUNTER_OldCamp_Attack > 0)<br> * * * *{<br> * * * * * *// криминал - нападение<br> * * * * * *return CRIME_ATTACK;<br> * * * *};<br> * * * *// если счетчик убийств овец > 0<br> * * * *if(PETZCOUNTER_OldCamp_Sheepkiller > 0)<br> * * * *{<br> * * * * * *// криминал - убийство овец<br> * * * * * *return CRIME_SHEEPKILLER;<br> * * * *};<br> * *};<br> * *// если НПС из Хориниса<br> * *if(C_NpcBelongsToCity(slf))<br> * *{<br> * * * *if(PETZCOUNTER_City_Murder > 0)<br> * * * *{<br> * * * * * *return CRIME_MURDER;<br> * * * *};<br> * * * *if(PETZCOUNTER_City_Theft > 0)<br> * * * *{<br> * * * * * *return CRIME_THEFT;<br> * * * *};<br> * * * *if(PETZCOUNTER_City_Attack > 0)<br> * * * *{<br> * * * * * *return CRIME_ATTACK;<br> * * * *};<br> * * * *if(PETZCOUNTER_City_Sheepkiller > 0)<br> * * * *{<br> * * * * * *return CRIME_SHEEPKILLER;<br> * * * *};<br> * *};<br> * *// если НПС из Монастыря<br> * *if(C_NpcBelongsToMonastery(slf))<br> * *{<br> * * * *if(PETZCOUNTER_Monastery_Murder > 0)<br> * * * *{<br> * * * * * *return CRIME_MURDER;<br> * * * *};<br> * * * *if(PETZCOUNTER_Monastery_Theft > 0)<br> * * * *{<br> * * * * * *return CRIME_THEFT;<br> * * * *};<br> * * * *if(PETZCOUNTER_Monastery_Attack > 0)<br> * * * *{<br> * * * * * *return CRIME_ATTACK;<br> * * * *};<br> * * * *if(PETZCOUNTER_Monastery_Sheepkiller > 0)<br> * * * *{<br> * * * * * *return CRIME_SHEEPKILLER;<br> * * * *};<br> * *};<br> * *// если НПС с Фермы наемников<br> * *if(C_NpcBelongsToFarm(slf))<br> * *{<br> * * * *if(PETZCOUNTER_Farm_Murder > 0)<br> * * * *{<br> * * * * * *return CRIME_MURDER;<br> * * * *};<br> * * * *if(PETZCOUNTER_Farm_Theft > 0)<br> * * * *{<br> * * * * * *return CRIME_THEFT;<br> * * * *};<br> * * * *if(PETZCOUNTER_Farm_Attack > 0)<br> * * * *{<br> * * * * * *return CRIME_ATTACK;<br> * * * *};<br> * * * *if(PETZCOUNTER_Farm_Sheepkiller > 0)<br> * * * *{<br> * * * * * *return CRIME_SHEEPKILLER;<br> * * * *};<br> * *};<br> * *// если НПС из Лагеря бандитов<br> * *if(C_NpcBelongsToBL(slf))<br> * *{<br> * * * *if(PETZCOUNTER_BL_Murder > 0)<br> * * * *{<br> * * * * * *return CRIME_MURDER;<br> * * * *};<br> * * * *if(PETZCOUNTER_BL_Theft > 0)<br> * * * *{<br> * * * * * *return CRIME_THEFT;<br> * * * *};<br> * * * *if(PETZCOUNTER_BL_Attack > 0)<br> * * * *{<br> * * * * * *return CRIME_ATTACK;<br> * * * *};<br> * *};<br> * *return CRIME_NONE;<br>};<br><br>
|
Re: Уроки скриптологии
13. Вспомогательные С_ функции для людей (compare функции).<br><br>Все С_ функции расположены в директории ..\AI\Human\С_Human\<br><br>Следующие два файла можно удалить по причине их бесполезности C_BanditAttackBandit.d и C_BanditHelpsStoryBandit.d<br><br>// ************************************************** ******************<br>// Проверка состояния тела НПС<br>// -------------------------------------------------------------------- <br>// Примечание автора: Никогда не используйте встроенную функцию Npc_GetBodyState<br>// напрямую, т.к. сравнение всегда будет ложно, если установлены дополнительные<br>// флаги состояния тела. Все запросы на состояние тела выполняйте только <br>// через эту функцию.<br>// ************************************************** ******************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - НПС, состояние тела которого проверяется<br>// bodystate - проверяемое состояние тела<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - состояние тела НПС совпадает с проверяемым, FALSE - не совпадает<br>// ================================================== ==================<br><br>func int C_BodyStateContains(var C_NPC slf,var int bodystate)<br>{<br> * *// Примечание автора: Руки прочь от этой формулы!!! Я знаю точно что я делаю! (Мое примечание: с точки зрения логического анализа формула неправильна).<br> * *// если фактическое состояние тела НПС без учета допфлагов равно запрошенному состоянию без учета допфлагов<br> * *if((Npc_GetBodyState(slf)&(BS_MAX¦BS_FLAG_INT ERRUPTABLE¦BS_FLAG_FREEHA<br>NDS)) == (bodystate&(BS_MAX¦BS_FLAG_INTERRUPTABLE¦BS_FL AG_FREEHANDS)))<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// ************************************************** ******************************<br>// Убивается ли НПС по окончании жизни или переводится в бессознательное состояние<br>// ************************************************** ******************************<br><br>// ================================================== ==================<br>// self - проверяемый НПС<br>// other - преступник, убивающий НПС<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - НПС не убивается преступником, FALSE - убивается.<br>// ================================================== ==================<br><br>func int C_DropUnconscious()<br>{<br> * *// если преступник монстр или Черный маг (Ищущий) или бандит или преступнику разрешено убить НПС<br> * *if(other.guild > GIL_SEPERATOR_HUM) ¦¦ (other.guild == GIL_DMT) ¦¦ (other.guild == GIL_BDT) ¦¦ (other.aivar[AIV_DropDeadAndKill] == TRUE)<br> * *{<br> * * * *// НПС будет убит<br> * * * *return FALSE;<br> * *};<br> * *// если НПС человек<br> * *if(self.guild < GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// если НПС не Черный маг и не бандит и его не разрешено убивать преступнику<br> * * * *if(self.guild != GIL_DMT) && (self.guild != GIL_BDT) && (self.aivar[AIV_DropDeadAndKill] == FALSE)<br> * * * *{<br> * * * * * *// НПС будет безсознания<br> * * * * * *return TRUE;<br> * * * *};<br> * *};<br> * *// НПС будет убит<br> * *return FALSE;<br>};<br><br>... и ещё<br><br>// ************************************************** ***************<br>// Может ли быть взят предмет, принадлежащий одному НПС, другим НПС<br>// ************************************************** ***************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - НПС, которому может принадлежать предмет<br>// oth - НПС берущий предмет (ГГ)<br>// itm - предмет<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - предмет взять нельзя, FALSE - взять можно.<br>// ================================================== ==================<br><br>func int C_IsTakenItemMyPossession(var C_NPC slf,var C_NPC oth,var C_ITEM itm)<br>{<br> * *var int portalguild;<br> * *// получить номер гильдии, которой принадлежит помещение (-1 помещение никому не принадлежит)<br> * *portalguild = Wld_GetPlayerPortalGuild();<br> * *// Моё примечание: предыдущие две строки лишние и могут быть удалены.<br> * *// если предмет принадлежит НПС владельцу<br> * *if(Npc_OwnedByNpc(itm,slf)) <br> * *{<br> * * * *// если предмет Святой молот<br> * * * *if(Hlp_IsItem(itm,Holy_Hammer_MIS))<br> * * * *{<br> * * * * * *// Святой молот взят<br> * * * * * *Hammer_Taken = TRUE;<br> * * * *};<br> * * * *// брать нельзя<br> * * * *return TRUE;<br> * *};<br> * *// если предмет выброшен (просто валяется)<br> * *if((itm.flags & ITEM_DROPPED) == ITEM_DROPPED)<br> * *{<br> * * * *// брать можно<br> * * * *return FALSE;<br> * *};<br> * *// если ГГ находится в помещении, принадлежащем НПС или помещение публично<br> * *// Моё примечание: правильнее вместо self написать slf, а то в некоторых случаях может быть ошибка.<br> * *if(C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ (Wld_GetPlayerPortalGuild() == GIL_PUBLIC)<br> * *{<br> * * * *// брать нельзя<br> * * * *return TRUE;<br> * *}; *<br> * *// если отношения между гильдиями НПС и гильдией, владеющей предметом, дружественные<br> * *if(Wld_GetGuildAttitude(slf.guild,itm.ownerguild) == ATT_FRIENDLY)<br> * *{<br> * * * *// брать нельзя<br> * * * *return TRUE;<br> * *};<br> * *// брать можно<br> * *return FALSE;<br>};<br><br>... и ещё<br><br>// ************************************************** **************<br>// Можно ли импользовать MOB, принадлежащий одному НПС, другим НПС<br>// ************************************************** **************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - НПС, которому может принадлежать MOB<br>// oth - НПС использующий MOB (ГГ)<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - MOB использовать нельзя, FALSE - можно.<br>// ================================================== ==================<br><br>func int C_IsUsedMobMyPossession(var C_NPC slf,var C_NPC oth)<br>{<br> * *// Моё примечание: правильнее вместо self и other внутри функции написать slf и oth, а то в некоторых случаях может быть ошибка.<br> * *// если MOB, используемый ГГ, принадлежит НПС <br> * *if(Npc_IsDetectedMobOwnedByNpc(other,self)) <br> * *{<br> * * * *// нельзя<br> * * * *return TRUE;<br> * *};<br> * *// если ГГ находится в помещении, принадлежащем НПС или помещение публично<br> * *if(C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ (Wld_GetPlayerPortalGuild() == GIL_PUBLIC)<br> * *{<br> * * * *// нельзя<br> * * * *return TRUE;<br> * *}; *<br> * *// можно<br> * *return FALSE;<br>};<br><br>
|
Re: Уроки скриптологии
// ************************************************** ******************<br>// Функции проверяющие принадлежность НПС к определенной локации<br>// ************************************************** ******************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - принадлежит, FALSE - нет.<br>// ================================================== ==================<br><br>// Проверка принадлежности к Миненталю<br>// --------------------------------------------------------------------<br>func int C_NpcBelongsToOldCamp(var C_NPC slf)<br>{<br> * *// если НПС значим или из окружающего народа в Минентале<br> * *if(slf.npctype == NPCTYPE_OCMAIN) ¦¦ (slf.npctype == NPCTYPE_OCAMBIENT)<br> * *{<br> * * * *// если НПС Горожанин или Милиционер или Паладин<br> * * * *if(slf.guild == GIL_VLK) ¦¦ (slf.guild == GIL_MIL) ¦¦ (slf.guild == GIL_PAL)<br> * * * *{<br> * * * * * *return TRUE;<br> * * * *};<br> * *};<br> * *return FALSE;<br>};<br><br>// Проверка принадлежности к Хоринису<br>// --------------------------------------------------------------------<br>func int C_NpcBelongsToCity(var C_NPC slf)<br>{<br> * *// если НПС не из Миненталя<br> * *if(!C_NpcBelongsToOldCamp(slf))<br> * *{<br> * * * *// если НПС Горожанин или Милиционер или Паладин<br> * * * *if(slf.guild == GIL_VLK) ¦¦ (slf.guild == GIL_MIL) ¦¦ (slf.guild == GIL_PAL)<br> * * * *{<br> * * * * * *return TRUE;<br> * * * *};<br> * *};<br> * *return FALSE;<br>};<br><br>// Проверка принадлежности к Монастырю<br>// ---------------------------------------------------------------------<br>func int C_NpcBelongsToMonastery(var C_NPC slf)<br>{<br> * *// если НПС Маг огня или Маг послушник<br> * *if(slf.guild == GIL_KDF) ¦¦ (slf.guild == GIL_NOV)<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>// Проверка принадлежности к Ферме наемников<br>// ---------------------------------------------------------------------<br>func int C_NpcBelongsToFarm(var C_NPC slf)<br>{<br> * *// если НПС Крестьянин или Наемник<br> * *if(slf.guild == GIL_BAU) ¦¦ (slf.guild == GIL_SLD)<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>// Проверка принадлежности к Лагерю бандитов<br>// ---------------------------------------------------------------------<br>func int C_NpcBelongsToBL(var C_NPC slf)<br>{<br> * *// если НПС из окружающего народа в Лагере или Долине бандитов<br> * *if(slf.npctype == NPCTYPE_BL_AMBIENT) ¦¦ (slf.npctype == NPCTYPE_BL_MAIN)<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// ******************************************<br>// Имеет ли НПС новости об окружающей жизни<br>// ******************************************<br><br>// ==========================================<br>// Аргументы:<br>// ------------------------------------------<br>// slf - проверяемый НПС<br>// ------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - новости есть, FALSE - нет.<br>// ==========================================<br><br> func int C_NpcHasAmbientNews(var C_NPC slf)<br>{ * * * <br> * *// если НПС не знает никаких новостей<br> * *if(slf.aivar[AIV_NewsOverride] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если ГГ не имеет криминала<br> * *if(B_GetPlayerCrime(slf) == CRIME_NONE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// новости есть (по умолчанию)<br> * *return TRUE;<br>};<br><br>... ещё файл<br><br>// *****************************************<br>// Является ли причиной атаки убийство цели<br>// *****************************************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - НПС агрессор<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - причина атаки - убийство, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_NpcHasAttackReasonToKill(var C_NPC slf)<br>{<br> * *// если <br> * *if (slf.aivar[AIV_ATTACKREASON] == AR_KILL) * * * * * * * * // ГГ убил НПС<br> * *¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_GuildEnemy) * * * * * // или НПС является врагом гильдии<br> * *¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman) * // или Человек убил человека<br> * *¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_GuardStopsIntruder) * // или Охрана ворот атакует незваного гостя<br> * *¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_GuardCalledToKill) * *// или Вызвана охрана по факту убийства<br> * *{<br> * * * *return TRUE; * *<br> * *};<br> * *return FALSE; <br>};<br><br>... ещё файл<br><br>// ************************************<br>// Находится ли ГГ в частном помещении<br>// ************************************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - НПС, которому может принадлежать помещение<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - ГГ в частном помещении, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_NpcIsBotheredByPlayerRoomGuild(var C_Npc slf)<br>{ * <br> * *var int portalguild;<br> * *// получить номер гильдии, которой принадлежит помещение (-1 помещение никому не принадлежит)<br> * *portalguild = Wld_GetPlayerPortalGuild();<br> * *// если помещение принадлежит гильдии и (НПС из этой гильдии или гильдия НПС и гильдия, владеющая помещением, дружественны)<br> * *if(portalguild > GIL_NONE) && ((slf.guild == portalguild) ¦¦ (Wld_GetGuildAttitude(slf.guild,portalguild) == ATT_FRIENDLY))<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// ************************************************** ***************<br>// Реагирует ли цель на оружие, направленное против нее агрессором<br>// ************************************************** ***************<br><br>// ================================================== ===============<br>// Аргументы:<br>// -----------------------------------------------------------------<br>// slf - НПС цель<br>// oth - НПС агрессор<br>// -----------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - цель реагирует, FALSE - нет.<br>// ================================================== ===============<br><br>func int C_NpcIsBotheredByWeapon(var C_NPC slf,var C_NPC oth)<br>{<br> * *// если цель член партии ГГ<br> * *if(slf.aivar[AIV_PARTYMEMBER] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если цель друг ГГ и агрессор ГГ (Примечание: правильней вместо other написать oth)<br> * *if(slf.npctype == NPCTYPE_FRIEND) && (Npc_IsPlayer(other))<br> * *{<br> * * * *return FALSE; <br> * *};<br> * *// если НПС имеет дело с "крутым парнем" и агрессор сражается оружием ближнего радиуса поражения<br> * *if(C_NpcIsToughGuy(slf)) && (Npc_IsInFightMode(oth,FMODE_MELEE))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если отношения между агрессором и целью дружественны<br> * *if(Npc_GetAttitude(slf,oth) == ATT_FRIENDLY)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если цель является охранником ворот<br> * *if(C_NpcIsGateGuard(slf))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если агрессор сражается кулаками<br> * *if(Npc_IsInFightMode(oth,FMODE_FIST)) * * * * * * * * * * * * * * * * * * * * * * * * * * * <br> * *{<br> * * * *return FALSE; <br> * *};<br> * *// если агрессор использует магию и категория используемого заклинания безвредна<br> * *if(Npc_IsInFightMode(oth,FMODE_MAGIC) && (Npc_GetActiveSpellCat(oth) != SPELL_BAD))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если цель Черный маг или орк<br> * *if((slf.guild == GIL_DMT) ¦¦ (slf.guild == GIL_ORC))<br> * *{<br> * * * *return FALSE;<br> * *}; *<br> * *return TRUE;<br>};<br><br>
|
Re: Уроки скриптологии
// **********************************************<br>// Находится ли НПС в бессознательном состоянии<br>// **********************************************<br> <br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - НПС в бессознательном состоянии (обездвижен), FALSE - нет.<br>// ================================================== ==================<br><br>func int C_NpcIsDown(var C_NPC slf)<br>{<br> * *// если НПС безсознания или в магическом сне или убит<br> * *if(Npc_IsInState(slf,ZS_Unconscious) ¦¦ Npc_IsInState(slf,ZS_MagicSleep) ¦¦ Npc_IsDead(slf))<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// ***********************************<br>// Является ли НПС источником зла<br>// ***********************************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - НПС - источник зла, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_NpcIsEvil(var C_NPC slf)<br>{<br> * *// если НПС<br> * *if (slf.guild == GIL_DMT) * * * * * * * * * * * * * // Черный маг<br> * *¦¦ (slf.guild == GIL_DRAGON) * * * * * * * * * * * *// или дракон<br> * *¦¦ (slf.guild == GIL_ORC) * * * * * * * * * * * * * // или орк<br> * *¦¦ (slf.guild == GIL_DRACONIAN) * * * * * * * * * * // или ящер<br> * *¦¦ (slf.guild == GIL_DEMON) * * * * * * * * * * * * // или демон<br> * *¦¦ (slf.guild == GIL_SUMMONED_DEMON) * * * * * * * *// или вызванный демон<br> * *¦¦ (slf.aivar[AIV_MM_REAL_ID] == ID_TROLL_BLACK) * *// или Черный троль<br> * *¦¦ (C_NpcIsUndead(slf)) * * * * * * * * * * * * * * // или НПС является нежитью<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// *************************************<br>// Является ли НПС охранником ворот<br>// *************************************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_NpcIsGateGuard(var C_NPC slf)<br>{<br> * *// если НПС находится в состоянии охраны ворот<br> * *if(Npc_IsInState(slf,ZS_Guard_Passage))<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// *************************************<br>// Является ли НПС ГГ<br>// *************************************<br><br>// =====================================<br>// Аргументы:<br>// -------------------------------------<br>// slf - проверяемый НПС<br>// -------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// =====================================<br><br>func int C_NpcIsHero(var C_NPC slf)<br>{<br> * *var C_NPC her;<br> * *// получить ссылку на ГГ<br> * *her = Hlp_GetNpc(PC_Hero);<br> * *// если идентификаторы НПС и ГГ равны<br> * *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(her))<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// ***********************************************<br >// Является ли НПС "крутым парнем"<br>// ***********************************************<br ><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_NpcIsToughGuy(var C_NPC slf)<br>{<br> * *// если установлен признак "крутого парня"<br> * *if(slf.aivar[AIV_ToughGuy] == TRUE) <br> * *{<br> * * * *return TRUE;<br> * *};<br> * *// если НПС наемник или охотник на драконов или бандит или пират<br> * *if(slf.guild == GIL_SLD) ¦¦ (slf.guild == GIL_DJG) ¦¦ (slf.guild == GIL_BDT) ¦¦ (slf.guild == GIL_PIR)<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// ***************************************<br>// Является ли НПС нежитью<br>// ***************************************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_NpcIsUndead(var C_NPC slf)<br>{<br> * *// если НПС<br> * * if (slf.guild == GIL_GOBBO_SKELETON) * * * * * * * // Скелет гоблина<br> * * ¦¦ (slf.guild == GIL_SUMMONED_GOBBO_SKELETON) * * *// или Вызванный скелет гоблина<br> * * ¦¦ (slf.guild == GIL_SKELETON) * * * * * * * * * * // или Скелет<br> * * ¦¦ (slf.guild == GIL_SUMMONED_SKELETON) * * * * * *// или Вызванный скелет<br> * * ¦¦ (slf.guild == GIL_SKELETON_MAGE) * * * * * * * *// или Скелет маг<br> * * ¦¦ (slf.guild == GIL_ZOMBIE) * * * * * * * * * * * // или Зомби<br> * * ¦¦ (slf.guild == GIL_SHADOWBEAST_SKELETON) * * * * // или Скелет мракориса<br> * * ¦¦ (slf.guild == GIL_UNDEADORC) * * * * * * * * * *// или Орк нежить<br> * * ¦¦ (slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_UNDEAD) // или Дракон нежить<br> * * {<br> * * * *return TRUE;<br> * * };<br> * * return FALSE;<br>};<br><br><br>
|
Re: Уроки скриптологии
Система шутить перестала, можно перейти и к делу.<br><br>// ************************************************<b r>// Должен ли НПС обыскать тело<br>// ************************************************<b r><br>// ================================================<b r>// Аргументы:<br>// ------------------------------------------------<br>// slf - обыскивающий НПС<br>// неявно: other - обыскиваемый НПС (цель)<br>// ------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================<b r><br>func int C_NpcRansacksAlways(var C_Npc slf)<br>{<br> * *// если НПС Гарвиг и цель имеет "Святой молот"<br> * *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Garwig)) && (Npc_HasItems(other,Holy_Hammer_MIS) > 0)<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *// если НПС Род и цель имеет "Меч Рода"<br> * *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Rod)) && (Npc_HasItems(other,ItMw_2h_Rod) > 0)<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// ************************************************** ******************<br>// Является ли НПС членом подставной гильдии<br>// ************************************************** ******************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - НПС определяющий подставу<br>// oth - проверяемый НПС (обычно ГГ)<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да (определяется что ГГ переодет), FALSE - нет.<br>// ================================================== ==================<br><br>func int C_PlayerHasFakeGuild(var C_NPC slf,var C_NPC oth)<br>{<br> * *var C_Item itm;<br> * *// получить доспехи ГГ<br> * *itm = Npc_GetEquippedArmor(oth);<br> * *// Примечание: следующие две строки не нужны при условии коррекции функции ниже<br> * *var int NSC_CommentRangerArmor;<br> * *NSC_CommentRangerArmor = TRUE;<br> * *// если НПС игнорирует доспехи, в которые одет ГГ<br> * *if(slf.aivar[AIV_IgnoresArmor] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС игнорирует подставную гильдию<br> * *if(slf.aivar[AIV_IgnoresFakeGuild] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС является охранником ворот (Примечание: правильнее вместо self написать slf)<br> * *if(C_NpcIsGateGuard(self) == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС бандит и ГГ переодетый в бандита<br> * *if(slf.guild == GIL_BDT) && C_PlayerIsFakeBandit(slf,oth)<br> * *{<br> * * * *// если ГГ без брони<br> * * * *if(Npc_HasEquippedArmor(oth) == FALSE)<br> * * * *{<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *}; *<br> * *// если ГГ без брони<br> * *if(Npc_HasEquippedArmor(oth) == FALSE)<br> * *{<br> * * * *return FALSE;<br> * *}<br> * *// если гильдии НПС и ГГ одинаковы (Примечание: else здесь лишнее)<br> * *else if(slf.guild == oth.guild)<br> * *{<br> * * * *// если доспехи ГГ "Кольчуга 'Кольца Воды'"<br> * * * *if(Hlp_IsItem(itm,ITAR_RANGER_Addon) == TRUE)<br> * * * *{<br> * * * * * *// Примечание: выполняется всегда, поэтому условие if можно удалить, оставив только return TRUE;<br> * * * * * *if(NSC_CommentRangerArmor == TRUE)<br> * * * * * *{<br> * * * * * * * *return TRUE;<br> * * * * * *}<br> * * * * * *// Примечание: блок else можно удалить<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *return FALSE;<br> * * * * * *}; *<br> * * * *};<br> * * * *// если ГГ не принадлежит к гильдии и одет в<br> * * * *if(oth.guild == GIL_NONE)<br> * * * *&& ((Hlp_IsItem(itm,ITAR_VLK_L) == TRUE) * * * *// "Одежду горожанина"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_VLK_M) == TRUE) * * * * // или "Одежду горожанина"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_VLK_H) == TRUE) * * * * // или "Одежду горожанина" (Примечание: кто может пояснить, чем отличаются эти одежды?)<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_BAU_L) == TRUE) * * * * // или "Одежду крестьянина"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_BAU_M) == TRUE) * * * * // или "Одежду крестьянина 2"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_Leather_L) == TRUE)) * *// или "Кожаные доспехи"<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *}<br> * * * *// Примечание: далее до конца блока все else можно удалить<br> * * * *// если ГГ милиционер и одет в<br> * * * *else if(oth.guild == GIL_MIL)<br> * * * *&& ((Hlp_IsItem(itm,ITAR_MIL_L) == TRUE) * * * *// "Легкие доспехи ополчения"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_MIL_M) == TRUE)) * * * *// или "Тяжелые доспехи ополчения"<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *}<br> * * * *// если ГГ паладин и одет в<br> * * * *else if(oth.guild == GIL_PAL)<br> * * * *&& ((Hlp_IsItem(itm,ITAR_PAL_M) == TRUE) * * * *// "Доспехи паладина"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_PAL_H) == TRUE)) * * * *// или "Доспехи паладина" (улучшенные)<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *}<br> * * * *// если ГГ наемник и одет в<br> * * * *else if(oth.guild == GIL_SLD)<br> * * * *&& ((Hlp_IsItem(itm,ITAR_SLD_L) == TRUE) * * * *// "Легкие доспехи наемника"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_SLD_M) == TRUE) * * * * // или "Средние доспехи наемника"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_SLD_H) == TRUE)) * * * *// или "Тяжелые доспехи наемника"<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *}<br> * * * *// если ГГ охотник на драконов и одет в<br> * * * *else if(oth.guild == GIL_DJG)<br> * * * *&& ((Hlp_IsItem(itm,ITAR_SLD_L) == TRUE) * * * *// "Легкие доспехи наемника"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_SLD_M) == TRUE) * * * * // или "Средние доспехи наемника"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_SLD_H) == TRUE) * * * * // или "Тяжелые доспехи наемника"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_DJG_L) == TRUE) * * * * // или "Легкие доспехи охотника на драконов"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_DJG_M) == TRUE) * * * * // или "Средние доспехи охотника на драконов"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_DJG_H) == TRUE) * * * * // или "Тяжелые доспехи охотника на драконов"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_DJG_Crawler) == TRUE)) *// или "Доспехи из панцирей ползунов"<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *}<br> * * * *// если ГГ маг послушник и одет в "Робу послушника"<br> * * * *else if(oth.guild == GIL_NOV) && (Hlp_IsItem(itm,ITAR_NOV_L) == TRUE)<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *}<br> * * * *// если ГГ маг огня и одет в<br> * * * *else if(oth.guild == GIL_KDF)<br> * * * *&& ((Hlp_IsItem(itm,ITAR_KDF_L) == TRUE) * * * *// "Робу мага огня"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_KDF_H) == TRUE)) * * * *// или "Тяжелую робу огня"<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return TRUE;<br> * * * *}; *<br> * *};<br> * *return FALSE;<br>}; * * *<br><br>... ещё файл<br><br>// ************************************************** ******************<br>// Является ли НПС членом гильдии бандитов<br>// ************************************************** ******************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - НПС определяющий подставу<br>// oth - проверяемый НПС (обычно ГГ)<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да (ГГ "принадлежит" к бандитам), FALSE - нет.<br>// ================================================== ==================<br><br>func int C_PlayerIsFakeBandit(var C_NPC slf,var C_NPC oth)<br>{<br> * *var C_Item itm; <br> * *// если НПС игнорирует доспехи, в которые одет ГГ<br> * *if(slf.aivar[AIV_IgnoresArmor] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС игнорирует подставную гильдию<br> * *if(slf.aivar[AIV_IgnoresFakeGuild] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС пират<br> * *if(slf.guild == GIL_PIR)<br> * *{<br> * * * *return FALSE;<br> * *}; *<br> * *// если ГГ одет в броню<br> * *if(Npc_HasEquippedArmor(oth) == TRUE)<br> * *{<br> * * * *// получить доспехи ГГ<br> * * * *itm = Npc_GetEquippedArmor(oth);<br> * * * *// если доспехи ГГ<br> * * * *if((Hlp_IsItem(itm,ITAR_BDT_M) == TRUE) * * * * // "Средняя бандитская кольчуга"<br> * * * *¦¦ (Hlp_IsItem(itm,ItAR_Thorus_Addon) == TRUE) *// или "Тяжелая кольчуга гардиста"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_BDT_H) == TRUE)) * * * *// или "Тяжелая бандитская кольчуга"<br> * * * *{<br> * * * * * *return TRUE;<br> * * * *};<br> * * * *return FALSE;<br> * *}<br> * *// если НПС бандит и текущий уровень - Яркендар и ГГ может разговаривать с бандитами (Равен убит)<br> * *if(slf.guild == GIL_BDT) && (CurrentLevel == ADDONWORLD_ZEN) && (Player_HasTalkedToBanditCamp == TRUE)<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// ************************************************** ******************<br>// Является ли НПС членом гильдии пиратов<br>// ************************************************** ******************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - НПС определяющий подставу<br>// oth - проверяемый НПС (обычно ГГ)<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да (ГГ "принадлежит" к пиратам), FALSE - нет.<br>// ================================================== ==================<br><br>func int C_PlayerIsFakePirate(var C_NPC slf,var C_NPC oth)<br>{<br> * *var C_Item itm;<br> * *// если НПС игнорирует доспехи, в которые одет ГГ<br> * *if(slf.aivar[AIV_IgnoresArmor] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС игнорирует подставную гильдию<br> * *if(slf.aivar[AIV_IgnoresFakeGuild] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если ГГ одет в броню (Примечание: правильнее вместо other написать oth)<br> * *if(Npc_HasEquippedArmor(other) == TRUE)<br> * *{<br> * * * *// получить доспехи ГГ<br> * * * *itm = Npc_GetEquippedArmor(oth);<br> * * * *// если доспехи ГГ<br> * * * *if((Hlp_IsItem(itm,ITAR_PIR_L_Addon) == TRUE) * // "Одежда пирата"<br> * * * *¦¦ (Hlp_IsItem(itm,ItAR_PIR_M_Addon) == TRUE) * // или "Доспехи пирата"<br> * * * *¦¦ (Hlp_IsItem(itm,ITAR_PIR_H_Addon) == TRUE)) *// или "Одежда капитана"<br> * * * *{<br> * * * * * *return TRUE;<br> * * * *};<br> * *};<br> * *return FALSE;<br>};<br><br>
|
Re: Уроки скриптологии
2Vam:<br>
Цитата:
|
Re: Уроки скриптологии
// *************************************************< br>// Отказывается ли НПС от предлагаемого разговора<br>// *************************************************< br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - НПС, которому предложили разговор<br>// oth - инициатор разговора (обычно ГГ)<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_RefuseTalk(var C_NPC slf,var C_NPC oth)<br>{<br> * *// если НПС не может говорить и он охраняет ворота и он не выдавал предупреждений<br> * *if(Npc_RefuseTalk(slf) == TRUE) && (C_NpcIsGateGuard(slf)) && (slf.aivar[AIV_Guardpassage_Status] == GP_NONE)<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *<br> * *// если НПС с ГГ не разговаривал и НПС находится от своего вайпоинта далее 5м<br> * *if(slf.aivar[AIV_TalkedToPlayer] == FALSE) && (Npc_GetDistToWP(slf,slf.wp) > 500)<br> * *{<br> * * * *// если НПС Лотар<br> * * * *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Lothar))<br> * * * *{<br> * * * * * *return TRUE;<br> * * * *};<br> * *};<br> * *// если НПС определил, что ГГ член подставной гильдии и НПС неуязвимый (Примечание: необходимо self заменить на slf)<br> * *if(C_PlayerHasFakeGuild(slf,oth) && (self.flags != NPC_FLAG_IMMORTAL)<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// *************************************<br>// Должен ли НПС атаковать убийцу<br>// *************************************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// oth - НПС убийца (обычно ГГ)<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_WantToAttackMurder(var C_NPC slf,var C_NPC oth)<br>{<br> * *// если НПС Черный маг или Заключенный или Охотник на драконов или Бандит<br> * *if(slf.guild == GIL_DMT) ¦¦ (slf.guild == GIL_STRF) ¦¦ (slf.guild == GIL_DJG) ¦¦ (slf.guild == GIL_BDT) *<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС игнорирует убийство<br> * *if(slf.aivar[AIV_IGNORE_Murder] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если убийца ГГ и НПС ему друг<br> * *if(Npc_IsPlayer(oth) && (slf.npctype == NPCTYPE_FRIEND))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС убийца должен быть убить цель<br> * *if(C_NpcHasAttackReasonToKill(oth))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС охраняет ворота<br> * *if(C_NpcIsGateGuard(slf))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *return TRUE;<br>};<br><br>... ещё файл<br><br>// ************************************************** ******<br>// Должен ли НПС напасть на незваного гостя<br>// ************************************************** ******<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_WantToAttackRoomIntruder(var C_NPC slf)<br>{<br> * *// Примечание: необходимо во всей функции self заменить на slf.<br> * *// если НПС Милиционер или Паладин или Наемник или Охотник на драконов или ГГ имеет совершенный криминал<br> * *if(self.guild == GIL_MIL) ¦¦ (self.guild == GIL_PAL) ¦¦ (self.guild == GIL_SLD) ¦¦ (self.guild == GIL_DJG) ¦¦ (B_GetPlayerCrime(self) != CRIME_NONE)<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// **************************************<br>// Должен ли НПС атаковать убийцу овец<br>// **************************************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// oth - НПС убийца (обычно ГГ)<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_WantToAttackSheepKiller(var C_NPC slf,var C_NPC oth)<br>{<br> * *// если НПС Черный маг или Заключенный или Бандит или Охотник на драконов<br> * *if(slf.guild == GIL_DMT) ¦¦ (slf.guild == GIL_STRF) ¦¦ (slf.guild == GIL_BDT) ¦¦ (slf.guild == GIL_DJG)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НРС игнорирует убийство овец<br> * *if(slf.aivar[AIV_IGNORE_Sheepkiller] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если убийца ГГ и НПС ему друг<br> * *if(Npc_IsPlayer(oth) && (slf.npctype == NPCTYPE_FRIEND))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если убийца должен был убить овцу<br> * *if(C_NpcHasAttackReasonToKill(oth))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если убийца человек и у него была причина нападения (Примечание: необходимо other заменить на oth)<br> * *if(other.guild < GIL_SEPERATOR_HUM) && (other.aivar[AIV_ATTACKREASON] != AR_NONE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС охраняет ворота<br> * *if(C_NpcIsGateGuard(slf))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *return TRUE;<br>};<br><br>... ещё файл<br><br>// ******************************************<br>// Должен ли НПС атаковать вора<br>// ******************************************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// oth - НПС вор (обычно ГГ)<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_WantToAttackThief(var C_NPC slf,var C_NPC oth)<br>{<br> * *// если НПС Черный ман или Заключенный или Охотник на драконов<br> * *if(slf.guild == GIL_DMT) ¦¦ (slf.guild == GIL_STRF) ¦¦ (slf.guild == GIL_DJG)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС не реагирует на воровство<br> * *if(slf.aivar[AIV_IGNORE_Theft] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС проиграл последнее сражение с ГГ<br> * *if(slf.aivar[AIV_LastFightAgainstPlayer] == FIGHT_LOST)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если вор ГГ и НПС ему друг<br> * *if(Npc_IsPlayer(oth) && (slf.npctype == NPCTYPE_FRIEND))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС охраняет ворота<br> * *if(C_NpcIsGateGuard(slf))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *return TRUE;<br>};<br><br>... ещё файл<br><br>// *********************************<br>// Должен ли НПС убежать от цели<br>// *********************************<br> * *<br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// oth - цель (обычно ГГ)<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_WantToFlee(var C_NPC slf,var C_NPC oth)<br>{<br> * *// никогда не убегает!!!<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// *********************************<br>// Должен ли НПС обыскать тело<br>// *********************************<br><br>// =================================<br>// Аргументы:<br>// ---------------------------------<br>// slf - проверяемый НПС<br>// other - тело (задано неявно)<br>// ---------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// =================================<br><br>func int C_WantToRansack(var C_NPC slf)<br>{<br> * *// если НРС друг ГГ и тело есть ГГ<br> * *if(slf.npctype == NPCTYPE_FRIEND) && (Npc_IsPlayer(other))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС Равен<br> * *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Raven))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС Черный маг или Орк или Паладин или Маг огня или Послушник или Маг воды<br> * *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)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *return TRUE;<br>};<br><br>... ещё файл<br><br>// **********************************************<br>// Должен ли НПС реагировать на крадущегося ГГ<br>// **********************************************<br> <br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый НПС<br>// oth - крадущийся НПС (обычно ГГ)<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_WantToReactToSneaker(var C_NPC slf,var C_NPC oth)<br>{<br> * *// если расстояние между НПС и ГГ > 7м<br> * *if(Npc_GetDistToNpc(slf,oth) > 700)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС Черный маг или Заключенный или Бандит и НПС не принадлежит к Лагерю бандитов<br> * *if(slf.guild == GIL_DMT) ¦¦ (slf.guild == GIL_STRF) ¦¦ ((slf.guild == GIL_BDT) && !C_NpcBelongsToBL(slf)) <br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС друг ГГ и ГГ крадется<br> * *if(slf.npctype == NPCTYPE_FRIEND) && (Npc_IsPlayer(oth))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если отношения между НПС и крадущимся НПС дружеские<br> * *if(Npc_GetAttitude(slf,oth) == ATT_FRIENDLY)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если НПС охраняет ворота (Примечание: необходимо self заменить на slf)<br> * *if(C_NpcIsGateGuard(self))<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *return TRUE;<br>};<br><br>
|
Re: Уроки скриптологии
2Pa:<br>
Цитата:
|
Re: Уроки скриптологии
14. Отношения между гильдиями.<br><br>Отношения между гильдиями людей задаются в файле AI\Human\Guilds.d в виде таблицы. Ссылки в скриптах на эту таблицу вы не найдете, она используется только экзешником.<br>Примечание: Таблицу необходимо смотреть в широкоформатном редакторе.<br><br>// размер таблицы<br>const int TAB_ANZAHL = 16 * 16;<br><br>// таблица отношений между гильдиями людей<br>const int GIL_ATTITUDES[TAB_ANZAHL] = * <br>{<br>// ***Гильдии*** * Отсутствует * Паладин * * * Милиционер * *Горожанин * * Маг огня * * *Послушник * * Охотник драк. Наемник * * * Крестьянин * *Бандит * * * *Заключенный *Черный маг * *Чузеземец * * Пират * * * * Маг воды * * *Публичная * * * <br>/* Отсутствует **/ 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, * *<br>/************************************************** *****************************<br>***************** ************************************************** *************<br>********************************* ***********************************************<br >/* Паладин * * **/ 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, * *<br>/* Милиционер * */ 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, * *<br>/* Горожанин * **/ 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, * *<br>/************************************************** *****************************<br>***************** ************************************************** *************<br>********************************* ***********************************************<br >/* Маг огня * * */ 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, * *<br>/* Послушник * **/ 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, * *<br>/************************************************** *****************************<br>***************** ************************************************** *************<br>********************************* ***********************************************<br >/* Охотник драк.*/ 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, * *<br>/* Наемник * * **/ 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, * *<br>/* Крестьянин * */ 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, * *<br>/************************************************** *****************************<br>***************** ************************************************** *************<br>********************************* ***********************************************<br >/* Бандит * * * */ 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, * *<br>/* Заключенный **/ 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, * *<br>/* Черный маг * */ 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, * *<br>/************************************************** *****************************<br>***************** ************************************************** *************<br>********************************* ***********************************************<br >/* Чужеземец * **/ 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, * *<br>/* Пират * * * **/ 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, * *<br>/* Маг воды * * */ 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, * *<br>/* Публичная * **/ 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 <br>};<br><br><br>Отношения между гильдиями монстров и гильдиями монстров и людей задаются в файле AI\Monster\B_Monster\B_InitMonsterAttitudes.d<br>Д анный файл я приводить не буду, у него очень большой размер (около 160 Кб).<br>Все отношения задаются через вызов функции B_InitMonsterAttitudes(), эту функцию мы и рассмотрим: она расположена в этой же директории в одноименном файле.<br><br>// ************************************************** ******************<br>// Устанавливает отношения между гильдиями монстров и всеми остальными<br>// ************************************************** ******************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// fromGuild - гильдия для которой устанавливается отношение<br>// attitude - отношение<br>// toGuild - гильдия с которой устанавливается отношение<br>// ================================================== ==================<br><br>func void B_SetMonsterAttitude(var int fromGuild,var int attitude,var int toGuild)<br>{<br> * *// если отношение устанавливается с людьми<br> * *if(toGuild == GIL_SEPERATOR_HUM)<br> * *{<br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_NONE) ;<br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_PAL); <br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_MIL); <br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_VLK); <br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_KDF); <br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_NOV); <br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_DJG); <br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_SLD); <br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_BAU); <br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_BDT); <br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_STRF) ;<br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_OUT); <br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_PIR); <br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,GIL_KDW); <br> * *}<br> * *// если отношение устанавливается для людей<br> * *else if(fromGuild == GIL_SEPERATOR_HUM)<br> * *{<br> * * * *Wld_SetGuildAttitude(GIL_NONE,attitude,toGuild);< br> * * * *Wld_SetGuildAttitude(GIL_PAL, attitude,toGuild);<br> * * * *Wld_SetGuildAttitude(GIL_MIL, attitude,toGuild);<br> * * * *Wld_SetGuildAttitude(GIL_VLK, attitude,toGuild);<br> * * * *Wld_SetGuildAttitude(GIL_KDF, attitude,toGuild);<br> * * * *Wld_SetGuildAttitude(GIL_NOV, attitude,toGuild);<br> * * * *Wld_SetGuildAttitude(GIL_DJG, attitude,toGuild);<br> * * * *Wld_SetGuildAttitude(GIL_SLD, attitude,toGuild);<br> * * * *Wld_SetGuildAttitude(GIL_BAU, attitude,toGuild);<br> * * * *Wld_SetGuildAttitude(GIL_BDT, attitude,toGuild);<br> * * * *Wld_SetGuildAttitude(GIL_STRF,attitude,toGuild);< br> * * * *Wld_SetGuildAttitude(GIL_OUT, attitude,toGuild);<br> * * * *Wld_SetGuildAttitude(GIL_PIR, attitude,toGuild);<br> * * * *Wld_SetGuildAttitude(GIL_KDW, attitude,toGuild);<br> * *}<br> * *else // устанавливается отношение между монстрами<br> * *{<br> * * * *Wld_SetGuildAttitude(fromGuild,attitude,toGuild); <br> * *};<br>};<br><br>
|
Re: Уроки скриптологии
15. Магия.<br><br>Общие магические функции расположены в директории AI\Magic<br><br>// ************************************************** **<br>// Регистрация повреждения от магии и начисление экспы<br>// ************************************************** **<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - НПС кастующий заклинание<br>// oth - НПС цель<br>// damage - повреждение, нанесенное заклинанием<br>// ================================================== ==================<br><br>func void B_MagicHurtNpc(var C_NPC slf,var C_NPC oth,var int damage)<br>{<br> * *// уменьшить жизнь цели на величину повреждения<br> * *Npc_ChangeAttribute(oth,ATR_HITPOINTS,-damage);<br> * *// если цель мертва<br> * *if(Npc_IsDead(oth))<br> * *{<br> * * * *// (если кастующий ГГ или кастующий член партии ГГ) и экспа за цель не была начислена<br> * * * *if(Npc_IsPlayer(slf) ¦¦ (slf.aivar[AIV_PARTYMEMBER]==TRUE)) && (oth.aivar[AIV_VictoryXPGiven] == FALSE)<br> * * * *{<br> * * * * * *// начисление ГГ экспы (уровень цели * 10) (Примечание: Ошибка - вместо self.level должно быть oth.level)<br> * * * * * *B_GivePlayerXP(self.level * XP_PER_VICTORY);<br> * * * * * *// установить НПС флаг начисления экспы<br> * * * * * *oth.aivar[AIV_VictoryXPGiven] = TRUE;<br> * * * *};<br> * *};<br>};<br><br>... ещё файл<br><br>// **************************************<br>// Подготовка заклинания к использованию<br>// **************************************<br><br>// ================================================<b r>// Аргументы:<br>// ------------------------------------------------<br>// slf - НПС кастующий заклинание<br>// spell - заклинание<br>// mana - требуемое кол-во маны<br>// ================================================<b r><br>func void B_ReadySpell(var C_NPC slf,var int spell,var int mana)<br>{<br> * *// если макс. мана < требуемой<br> * *if(slf.attribute[ATR_MANA_MAX] < mana)<br> * *{<br> * * * *<br> * * * *// увеличить макс. ману на величину требуемой<br> * * * *Npc_ChangeAttribute(slf,ATR_MANA_MAX,mana);<br> * *};<br> * *// если мана < требуемой<br> * *if(slf.attribute[ATR_MANA] < mana)<br> * *{<br> * * * *// увеличить ману на величину требуемой<br> * * * *Npc_ChangeAttribute(slf,ATR_MANA,mana);<br> * *};<br> * *// если это заклинание уже применяется<br> * *if(Npc_IsDrawingSpell(slf) == spell)<br> * *{<br> * * * *return;<br> * *} * <br> * *// если это заклинание уже активно<br> * *if(Npc_GetActiveSpell(slf) == spell) <br> * *{<br> * * * *return; * * <br> * *}<br> * *// если активно другое заклинание<br> * *else if(Npc_GetActiveSpell(slf) != -1) <br> * *{<br> * * * *// убрать старое заклинание<br> * * * *AI_RemoveWeapon(slf);<br> * *};<br> * *// взять заклинание в руку<br> * *AI_ReadySpell(slf,spell,mana);<br>};<br><br>... ещё файл<br><br>// ************************************************** ***********<br>// Выбор заклинания кастующим НПС<br>// ************************************************** ***********<br><br>// ================================================== ===========<br>// Аргументы:<br>// -------------------------------------------------------------<br>// slf - НПС кастующий заклинание (агрессор)<br>// oth - НПС цель<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - заклинание готово, FALSE - нет.<br>// ================================================== ===========<br><br>func int B_SelectSpell(var C_NPC slf,var C_NPC oth)<br>{ * <br> * *// если агрессор друг ГГ и цель ГГ и цель человек<br> * *if(slf.npctype == NPCTYPE_FRIEND) && Npc_IsPlayer(oth) && (oth.guild < GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// если агрессор Маг огня или агрессор всегда использует магию<br> * * * *if(slf.guild == GIL_KDF) ¦¦ (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS)<br> * * * *{<br> * * * * * *// если агрессор не имеет руны Сон<br> * * * * * *if(Npc_HasItems(slf,ItRu_Sleep) == 0)<br> * * * * * *{<br> * * * * * * * *// создать в инвентаре агрессора руну Сон<br> * * * * * * * *CreateInvItems(slf,ItRu_Sleep,1);<br> * * * * * *};<br> * * * * * *// подготовка заклинания Сон<br> * * * * * *B_ReadySpell(slf,SPL_Sleep,SPL_Cost_Sleep);<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// если агрессор Черный маг и агрессор всегда использует магию<br> * *if(slf.guild == GIL_DMT) && (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS)<br> * *{<br> * * * * * *// создать в инвентаре агрессора следующие руны, если он их не имеет<br> * * * * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0) {CreateInvItems(slf,ItRu_InstantFireball,1);}; *// "Огненный шар"<br> * * * * * *if(Npc_HasItems(slf,ItRu_Deathbolt) == 0) * * * {CreateInvItems(slf,ItRu_Deathbolt,1);}; * * * *// "Deathbolt" (Примечание: название не переведено)<br> * * * * * *if(Npc_HasItems(slf,ItRu_Deathball) == 0) * * * {CreateInvItems(slf,ItRu_Deathball,1);}; * * * *// "Deathball"<br> * * * * * *if(Npc_HasItems(slf,ItRu_Firerain) == 0) * * * *{CreateInvItems(slf,ItRu_Firerain,1);}; * * * * // "Огненный дождь"<br> * * * * * *if(Npc_HasItems(slf,ItRu_Thunderstorm) == 0) * *{CreateInvItems(slf,ItRu_Thunderstorm,1);}; * * // "Шторм"<br> * * * * * *if(Npc_HasItems(slf,ItRu_LightningFlash) == 0) *{CreateInvItems(slf,ItRu_LightningFlash,1);}; * // "Удар молнии"<br> * * * * * *if(Npc_HasItems(slf,ItRu_Firestorm) == 0) * * * {CreateInvItems(slf,ItRu_Firestorm,1);}; * * * *// "Малая огненная буря"<br> * * * * * *if(Npc_HasItems(slf,ItRu_Skull) == 0) * * * * * {CreateInvItems(slf,ItRu_Skull,1);}; * * * * * *// "Крик мертвых"<br> * * * *// если агрессор "Черный маг" (Примечание: Маг какой-то особенный, хотя в переводе не отражено)<br> * * * *if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(DMT_1299_OberDementor_DI))<br> * * * *{<br> * * * * * *// подготовка заклинания "Крик мертвых"<br> * * * * * *B_ReadySpell(slf,SPL_Skull,SPL_Cost_Skull);<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else // обычные Черные маги<br> * * * *{<br> * * * * * *// если уже есть оружие готовое к бою <br> * * * * * *if(Npc_IsDrawingWeapon(slf)) <br> * * * * * *{<br> * * * * * * * *return TRUE;<br> * * * * * *};<br> * * * * * *// если случайное число не задано<br> * * * * * *if(slf.aivar[AIV_SelectSpell] <= 0)<br> * * * * * *{<br> * * * * * * * *var int dK_rnd;<br> * * * * * * * *dK_rnd = Hlp_Random(10);<br> * * * * * * * *// получить случайное число<br> * * * * * * * *slf.aivar[AIV_SelectSpell] += dK_rnd;<br> * * * * * *};<br> * * * * * *// если случайное число < 10<br> * * * * * *if(slf.aivar[AIV_SelectSpell] < 10)<br> * * * * * *{<br> * * * * * * * *// если Глава <= 3, то подготовить заклинание "Огненный шар"<br> * * * * * * * *if(Kapitel <= 3) * * * *{B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_In stantFireball); return TRUE;}<br> * * * * * * * *// если Глава <= 4, то подготовить заклинание "Deathbolt"<br> * * * * * * * *else if (Kapitel <= 4) *{B_ReadySpell(slf,SPL_DeathBolt,SPL_Cost_DeathBol t); return TRUE;}<br> * * * * * * * *// иначе подготовить заклинание "Deathbаll"<br> * * * * * * * *else /*Kap 5+*/ * * * * {B_ReadySpell(slf,SPL_DeathBall,SPL_Cost_DeathBall ); return TRUE;};<br> * * * * * *}<br> * * * * * *// если случайное число == 10<br> * * * * * *else if(slf.aivar[AIV_SelectSpell] == 10)<br> * * * * * *{ * <br> * * * * * * * *// случайное число = 11<br> * * * * * * * *slf.aivar[AIV_SelectSpell] = 11;<br> * * * * * * * *var int dK_Mega;<br> * * * * * * * *dK_Mega = Hlp_Random(100);<br> * * * * * * * *// с вероятностью 0.02 подготовить заклинание "Огненный дождь"<br> * * * * * * * *if * * *(dK_Mega <= 2) *{B_ReadySpell(slf,SPL_Firerain,SPL_Cost_Firerain) ; * * * * * * *return TRUE;}<br> * * * * * * * *// с вероятностью 0.03 подготовить заклинание "Шторм"<br> * * * * * * * *else if (dK_Mega <= 5) *{B_ReadySpell(slf,SPL_Thunderstorm,SPL_Cost_Thund erstorm); * * *return TRUE;}<br> * * * * * * * *// с вероятностью 0.05 подготовить заклинание "Удар молнии"<br> * * * * * * * *else if (dK_Mega <= 10) {B_ReadySpell(slf,SPL_LightningFlash,SPL_Cost_Ligh tningFlash); *return TRUE;}<br> * * * * * * * *// с вероятностью 0.9 подготовить заклинание "Малая огненная буря"<br> * * * * * * * *else * * * * * * * * * *{B_ReadySpell(slf,SPL_Firestorm,SPL_Cost_Firestor m); * * * * * *return TRUE;};<br> * * * * * *}<br> * * * * * *// если случайное число == 12<br> * * * * * *else if (slf.aivar[AIV_SelectSpell] == 12)<br> * * * * * *{ * <br> * * * * * * * *// случайное число == 0<br> * * * * * * * *slf.aivar[AIV_SelectSpell] = 0;<br> * * * * * *};<br> * * * *};<br> * * * *return TRUE;<br> * *};<br> * *// если агрессор Маг огня или агрессор всегда использует магию<br> * *if(slf.guild == GIL_KDF) ¦¦ (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS)<br> * *{<br> * * * *// создать в инвентаре агрессора следующие руны, если он их не имеет<br> * * * *if(Npc_HasItems(slf,ItRu_Concussionbolt) == 0)<br> * * * *{<br> * * * * * *CreateInvItems(slf,ItRu_Concussionbolt,1); * * *// "Concussionbolt" (Название не переведено)<br> * * * *};<br> * * * *if(Npc_HasItems(slf,ItRu_InstantFireBall) == 0)<br> * * * *{<br> * * * * * *CreateInvItems(slf,ItRu_InstantFireBall,1); * * // "Огненный шар"<br> * * * *};<br> * * * *if(Npc_HasItems(slf,ItRu_Deathball) == 0)<br> * * * *{<br> * * * * * *CreateInvItems(slf,ItRu_Deathball,1); * * * * * // "Deathball" (Название не переведено)<br> * * * *};<br> * * * *if(Npc_HasItems(slf,ItRu_FullHeal) == 0)<br> * * * *{<br> * * * * * *CreateInvItems(slf,ItRu_FullHeal,1); * * * * * *// "Лечить сильное ранение"<br> * * * *};<br> * * * *// если текущая жизнь агрессора < 100 (Примечание: здесь и далее необходимо self заменить на slf)<br> * * * *if(self.attribute[ATR_HITPOINTS] < 100) <br> * * * *{<br> * * * * * *// подготовить заклинание "Лечить сильное ранение"<br> * * * * * *B_ReadySpell(slf,SPL_FullHeal,SPL_Cost_FullHeal); <br> * * * * * *return TRUE;<br> * * * *}<br> * * * *// если причина атаки агрессора убийство цели<br> * * * *else if(C_NpcHasAttackReasonToKill(self))<br> * * * *{<br> * * * * * *// если цель неуязвима или цель Равен (Примечание: Ошибка - необходимо self и other заменить на oth)<br> * * * * * *if(self.flags == NPC_FLAG_IMMORTAL) ¦¦ (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(Raven))<br> * * * * * *{<br> * * * * * * * *// подготовить заклинание "Deathball"<br> * * * * * * * *B_ReadySpell(slf,SPL_Deathball,SPL_Cost_Deathball );<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// подготовить заклинание "Огненный шар"<br> * * * * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireBall);<br> * * * * * *};<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// подготовить заклинание "Concussionbolt"<br> * * * * * *B_ReadySpell(slf,SPL_Concussionbolt,SPL_Cost_Conc ussionbolt);<br> * * * * * *return TRUE;<br> * * * *};<br> * *};<br> * *// если агрессор Паладин<br> * *if(slf.guild == GIL_PAL)<br> * *{<br> * * * *// если агрессор применяет тактику сражения охраны крепостных стен<br> * * * *if(slf.fight_tactic == FAI_NAILED)<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * * * *// если агрессор не имеет руны "Святая стрела"<br> * * * *if(Npc_HasItems(slf,ItRu_PalHolyBolt) == 0)<br> * * * *{<br> * * * * * *// создать в инвентаре агрессора руну "Святая стрела"<br> * * * * * *CreateInvItems(slf,ItRu_PalHolyBolt,1);<br> * * * *};<br> * * * *// если расстояние между агрессором и целью > дистанции атаки оружием ближнего радиуса действия и цель является источником зла<br> * * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE) && (C_NpcIsEvil(oth))<br> * * * *{<br> * * * * * *// подготовить заклинание "Святая стрела"<br> * * * * * *B_ReadySpell(slf,SPL_PalHolyBolt,SPL_Cost_PalHoly Bolt);<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// если агрессор Маг скелетов<br> * *if(slf.guild == GIL_SKELETON_MAGE)<br> * *{<br> * * * *// создать в инвентаре агрессора следующие руны, если он их не имеет<br> * * * *if(Npc_HasItems(slf,ItRu_SumSkel) == 0)<br> * * * *{<br> * * * * * *CreateInvItems(slf,ItRu_SumSkel,1); * * // "Вызвать скелет"<br> * * * *};<br> * * * *if(Npc_HasItems(slf,ItRu_IceCube) == 0)<br> * * * *{<br> * * * * * *CreateInvItems(slf,ItRu_IceCube,1); * * // "Ледяная глыба"<br> * * * *};<br> * * * *if(Npc_HasItems(slf,ItRu_Icebolt) == 0)<br> * * * *{<br> * * * * * *CreateInvItems(slf,ItRu_Icebolt,1); * * // "Ледяная стрела"<br> * * * *};<br> * * * *// если случайное число >= 6<br> * * * *if(slf.aivar[AIV_SelectSpell] >= 6)<br> * * * *{<br> * * * * * *// случайное число = 1<br> * * * * * *slf.aivar[AIV_SelectSpell] = 1;<br> * * * *};<br> * * * *// если цель не заморожена и случайное число == 0<br> * * * *if(!Npc_IsInState(oth,ZS_MagicFreeze)) && (slf.aivar[AIV_SelectSpell] == 0)<br> * * * *{<br> * * * * * *// подготовить заклинание "Ледяная глыба"<br> * * * * * *B_ReadySpell(slf,SPL_IceCube,SPL_Cost_IceCube);<b r> * * * * * *return TRUE;<br> * * * *}<br> * * * *// если случайное число == 1<br> * * * *else if (slf.aivar[AIV_SelectSpell] == 1)<br> * * * *{<br> * * * * * *// подготовить заклинание "Вызвать скелет"<br> * * * * * *B_ReadySpell(slf,SPL_SummonSkeleton,SPL_Cost_Summ onSkeleton);<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// подготовить заклинание "Ледяная стрела"<br> * * * * * *B_ReadySpell(slf,SPL_Icebolt,SPL_Cost_Icebolt);<b r> * * * * * *return TRUE;<br> * * * *};<br> * *};<br> * *// если агрессор Ледяной голем<br> * *if(slf.guild == GIL_ICEGOLEM)<br> * *{<br> * * * *// если агрессор не имеет руны "Ледяная глыба"<br> * * * *if(Npc_HasItems(slf,ItRu_IceCube) == 0)<br> * * * *{<br> * * * * * *// создать в инвентаре агрессора руну "Ледяная глыба"<br> * * * * * *CreateInvItems(slf,ItRu_IceCube,1);<br> * * * *};<br> * * * *// если расстояние между агрессором и целью < дистанции атаки оружием ближнего радиуса действия или цель заморожена<br> * * * *if(Npc_GetDistToNpc(slf,oth) < FIGHT_DIST_MELEE) ¦¦ Npc_IsInState(oth,ZS_MagicFreeze) * * * * * * * * * * * * * * * <br> * * * *{<br> * * * * * *return FALSE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// подготовить заклинание "Ледяная глыба"<br> * * * * * *B_ReadySpell(slf,SPL_IceCube,SPL_Cost_IceCube);<b r> * * * * * *return TRUE;<br> * * * * * *<br> * * * *};<br> * *};<br> * *// если агрессор Огненный голем<br> * *if(slf.guild == GIL_FIREGOLEM)<br> * *{<br> * * * *// если агрессор не имеет руны "Огненный шар"<br> * * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)<br> * * * *{<br> * * * * * *// создать в инвентаре агрессора руну "Огненный шар"<br> * * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);<br> * * * *};<br> * * * *// если расстояние между агрессором и целью > дистанции атаки оружием ближнего радиуса действия<br> * * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE)<br> * * * *{<br> * * * * * *// подготовить заклинание "Огненный шар"<br> * * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// если агрессор Болотный дракон<br> * *if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_SWAMP)<br> * *{<br> * * * *// если агрессор не имеет руны "Огненный шар"<br> * * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)<br> * * * *{<br> * * * * * *// создать в инвентаре агрессора руну "Огненный шар"<br> * * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);<br> * * * *};<br> * * * *// если расстояние между агрессором и целью > дистанции применения драконами магии<br> * * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)<br> * * * *{<br> * * * * * *// подготовить заклинание "Огненный шар"<br> * * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// если агрессор Каменный дракон (всё идентично Болотному дракону)<br> * *if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ROCK)<br> * *{<br> * * * *if (Npc_HasItems(slf,ItRu_InstantFireball) == 0)<br> * * * *{<br> * * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);<br> * * * *};<br> * * * *if (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)<br> * * * *{<br> * * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// если агрессор Огненный дракон (всё идентично Болотному дракону)<br> * *if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE)<br> * *{<br> * * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)<br> * * * *{<br> * * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);<br> * * * *};<br> * * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)<br> * * * *{<br> * * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// если агрессор Ледяной дракон (всё идентично Болотному дракону)<br> * *if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE)<br> * *{<br> * * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)<br> * * * *{<br> * * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);<br> * * * *};<br> * * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)<br> * * * *{<br> * * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// если агрессор Дракон нежить<br> * *if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_UNDEAD)<br> * *{<br> * * * *// очистить очередь AI состояний агрессора (Примечание: заменить self на slf)<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// если агрессор не имеет руны "Deathball"<br> * * * *if(Npc_HasItems(slf,ItRu_Deathball) == 0)<br> * * * *{<br> * * * * * *// создать в инвентаре агрессора руну "Deathball"<br> * * * * * *CreateInvItems(slf,ItRu_Deathball,1);<br> * * * *};<br> * * * *// если расстояние между агрессором и целью > дистанции применения драконами магии<br> * * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)<br> * * * *{<br> * * * * * *// подготовить заклинание "Deathball"<br> * * * * * *B_ReadySpell(slf,SPL_Deathball,SPL_Cost_Deathball ); <br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *// если агрессор Шаман орков (всё идентично Огненному голему)<br> * *if(slf.aivar[AIV_MM_REAL_ID] == ID_ORCSHAMAN)<br> * *{<br> * * * *if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)<br> * * * *{<br> * * * * * *CreateInvItems(slf,ItRu_InstantFireball,1);<br> * * * *};<br> * * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE)<br> * * * *{<br> * * * * * *B_ReadySpell(slf,SPL_InstantFireball,SPL_Cost_Ins tantFireball);<br> * * * * * *return TRUE;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *return FALSE;<br> * * * *};<br> * *};<br> * *return FALSE;<br>}; * <br><br>
|
Re: Уроки скриптологии
// ************************************************** ****************<br>// Действия, оказываемые заклинаниями, на НПС<br>// ------------------------------------------------------------------<br>// Данная функция вызывается только экзешником в состоянии НПС реакции на магию<br>// self - НПС, против которого применено заклинание<br>// other - НПС, применивший заклинание<br>// ************************************************** ****************<br><br>const int COLL_DONOTHING * * * * * *= 0; * * * *// воздействие не оказывается<br>const int COLL_DOEVERYTHING * * * * = 1<<0; * * // полное воздействие<br>const int COLL_APPLYDAMAGE * * * * *= 1<<1; * * // только физический урон<br>const int COLL_APPLYHALVEDAMAGE * * = 1<<2; * * // половинный урон<br>const int COLL_APPLYDOUBLEDAMAGE * *= 1<<3; * * // удвоенный урон<br>const int COLL_APPLYVICTIMSTATE * * = 1<<4; * * // в зависимости от состояния жертвы<br>const int COLL_DONTKILL * * * * * * = 1<<5; * * // не убивает<br><br><br>// ================================================== ===========<br>// Аргументы:<br>// -------------------------------------------------------------<br>// spellType - тип заклинания<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// Тип оказываемого воздействия на НПС.<br>// ================================================== ===========<br><br>func int C_CanNpcCollideWithSpell(var int spellType)<br>{<br> * *// если заклинание "Смерч"<br> * *if(spellType == SPL_Whirlwind)<br> * *{<br> * * * *// если НПС обездвижен или<br> * * * *if (C_NpcIsDown(self))<br> * * * *¦¦ (C_BodyStateContains(self,BS_SWIM)) *// плывет<br> * * * *¦¦ (C_BodyStateContains(self,BS_DIVE)) *// или ныряет<br> * * * *¦¦ (self.guild == GIL_STONEGOLEM) * * * // или Каменный голем<br> * * * *¦¦ (self.guild == GIL_ICEGOLEM) * * * * // или Ледяной голем<br> * * * *¦¦ (self.guild == GIL_FIREGOLEM) * * * *// или Каменный голем<br> * * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // или Вызванный голем<br> * * * *¦¦ (self.guild == GIL_DEMON) * * * * * *// или Демон<br> * * * *¦¦ (self.guild == GIL_SUMMONED_DEMON) * // или Вызванный демон<br> * * * *¦¦ (self.guild == GIL_TROLL) * * * * * *// или Троль<br> * * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // повтор (убрать!)<br> * * * *¦¦ (self.guild == GIL_DRAGON) * * * * * // или Дракон<br> * * * *¦¦ (self.guild == GIL_STONEGUARDIAN) * *// или Каменный страж<br> * * * *¦¦ (self.flags == NPC_FLAG_IMMORTAL) * *// или неубиваем<br> * * * *¦¦ (self.guild == GIL_SHADOWBEAST) * * *// или Мракорис<br> * * * *¦¦ (self.guild == GIL_GARGOYLE) * * * * // или Огненный дух мракориса<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *// если НПС охраняет ворота<br> * * * *if(C_NpcIsGateGuard(self) == TRUE)<br> * * * *{<br> * * * * * *return COLL_APPLYDAMAGE;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING;<br> * *};<br> * *// если заклинание "Ледяное копье"<br> * *if(spellType == SPL_Icelance)<br> * *{<br> * * * *// если НПС обездвижен или плывет или ныряет<br> * * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *// если НПС Ледяной голем или Ледяной волк или Ледяной дракон<br> * * * *if(self.guild == GIL_ICEGOLEM) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_Icewolf) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE) * * * <br> * * * *{<br> * * * * * *return COLL_APPLYHALVEDAMAGE;<br> * * * *};<br> * * * *// если НПС Огненный голем или<br> * * * *if (self.guild == GIL_FIREGOLEM)<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN) * * // Огненная ящерица<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE) * // или Огненный дракон<br> * * * *¦¦ (self.guild == GIL_GARGOYLE) * * * * * * * * * * // или Огненный дух мракориса<br> * * * *{<br> * * * * * *return COLL_APPLYDOUBLEDAMAGE;<br> * * * *};<br> * * * *return COLL_APPLYDAMAGE;<br> * *};<br> * *// если заклинание "Шторм"<br> * *if (spellType == SPL_Thunderstorm)<br> * *{<br> * * * *// если НПС обездвижен или плывет или ныряет<br> * * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *// если НПС Ледяной голем или Ледяной волк или Ледяной дракон<br> * * * *if(self.guild == GIL_ICEGOLEM) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_Icewolf) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE) * * * <br> * * * *{<br> * * * * * *return COLL_APPLYHALVEDAMAGE;<br> * * * *};<br> * * * *// если НПС Огненный голем или<br> * * * *if (self.guild == GIL_FIREGOLEM)<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN) * * // Огненная ящерица<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE) * // или Огненный дракон<br> * * * *¦¦ (self.guild == GIL_GARGOYLE) * * * * * * * * * * // или Огненный дух мракориса<br> * * * *{<br> * * * * * *return COLL_APPLYDOUBLEDAMAGE;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING;<br> * *};<br> * *// если заклинание "Гейзер"<br> * *if(spellType == SPL_Geyser)<br> * *{<br> * * * *// если НПС обездвижен<br> * * * *if (C_NpcIsDown(self))<br> * * * *¦¦ (C_BodyStateContains(self,BS_SWIM)) *// или плывет<br> * * * *¦¦ (C_BodyStateContains(self,BS_DIVE)) *// или ныряет<br> * * * *¦¦ (self.guild == GIL_STONEGOLEM) * * * // или Каменный голем<br> * * * *¦¦ (self.guild == GIL_ICEGOLEM) * * * * // или Ледяной голем<br> * * * *¦¦ (self.guild == GIL_FIREGOLEM) * * * *// или Огненный голем<br> * * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // или Вызванный голем<br> * * * *¦¦ (self.guild == GIL_DEMON) * * * * * *// или Демон<br> * * * *¦¦ (self.guild == GIL_SUMMONED_DEMON) * // или Вызванный демон<br> * * * *¦¦ (self.guild == GIL_TROLL) * * * * * *// или Троль<br> * * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // повтор (убрать!)<br> * * * *¦¦ (self.guild == GIL_DRAGON) * * * * * // или Дракон<br> * * * *¦¦ (self.guild == GIL_STONEGUARDIAN) * *// или Каменный страж<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *return COLL_APPLYDAMAGE ¦ COLL_DONTKILL;<br> * *};<br> * *// если заклинание "Кулак воды"<br> * *if(spellType == SPL_Waterfist)<br> * *{<br> * * * *// если НПС обездвижен или плывет или ныряет<br> * * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *// если НПС Дракон или Троль<br> * * * *if(self.guild == GIL_DRAGON) ¦¦ (self.guild == GIL_TROLL)<br> * * * *{<br> * * * * * *return COLL_APPLYHALVEDAMAGE;<br> * * * *};<br> * * * *// если НПС Огненный голем или Огненная ящерица или Огненный дух мракориса<br> * * * *if(self.guild == GIL_FIREGOLEM) ¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN) ¦¦ (self.guild == GIL_GARGOYLE)<br> * * * *{<br> * * * * * *return COLL_APPLYDOUBLEDAMAGE;<br> * * * *};<br> * * * *return COLL_APPLYDAMAGE ¦ COLL_DONTKILL;<br> * *};<br> * *// если заклинание "Шар энергии"<br> * *if(spellType == SPL_EnergyBall)<br> * *{<br> * * * *// если НПС обездвижен или плывет или ныряет<br> * * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *// если НПС нежить<br> * * * *if(C_NpcIsUndead(self))<br> * * * *{<br> * * * * * *return COLL_APPLYHALVEDAMAGE;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING;<br> * *};<br> * *// если заклинание "Украсть энергию"<br> * *if(spellType == SPL_SuckEnergy)<br> * *{<br> * * * *// если НПС обездвижен или <br> * * * *if (C_NpcIsDown(self))<br> * * * *¦¦ (C_BodyStateContains(self,BS_SWIM)) * * *// плывет<br> * * * *¦¦ (C_BodyStateContains(self,BS_DIVE)) * * *// или ныряет<br> * * * *¦¦ (self.guild > GIL_SEPERATOR_HUM) * * * * // или монстр<br> * * * *¦¦ (self.flags == NPC_FLAG_IMMORTAL) * * * *// или неубиваем<br> * * * *¦¦ (Npc_GetDistToNpc(self,other) > 1000) * *// или расстояние между НПС > 10м<br> * * * *¦¦ (self.guild == GIL_DMT) * * * * * * * * *// или Черный маг<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING;<br> * *};<br> * *// если заклинание "Зеленые щупальца"<br> * *if(spellType == SPL_GreenTentacle)<br> * *{<br> * * * *// если НПС обездвижен или<br> * * * *if (C_NpcIsDown(self))<br> * * * *¦¦ (C_BodyStateContains(self,BS_SWIM)) * * * * * * * * *// плывет<br> * * * *¦¦ (C_BodyStateContains(self,BS_DIVE)) * * * * * * * * *// или ныряет<br> * * * *¦¦ (C_NpcIsGateGuard(self)== TRUE) * * * * * * * * * * *// или охраняет ворота<br> * * * *¦¦ (self.guild == GIL_BLOODFLY) * * * * * * * * * * * * // или Кровяной шершень<br> * * * *¦¦ (self.guild == GIL_DEMON) * * * * * * * * * * * * * *// или Демон<br> * * * *¦¦ (self.guild == GIL_TROLL) * * * * * * * * * * * * * *// или Троль<br> * * * *¦¦ (self.guild == GIL_DRAGON) * * * * * * * * * * * * * // или Дракон<br> * * * *¦¦ (self.guild == GIL_HARPY) * * * * * * * * * * * * * *// или Гарпия<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_SKELETON_MAGE) * * // или Маг скелетов<br> * * * *¦¦ (self.guild == GIL_Gargoyle) * * * * * * * * * * * * // или Огненный дух мракориса<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING;<br> * *};<br> * *// если заклинание "Рой"<br> * *if(spellType == SPL_Swarm)<br> * *{<br> * * * *// если НПС обездвижен или<br> * * * *if (C_NpcIsDown(self))<br> * * * *¦¦ (C_BodyStateContains(self,BS_SWIM)) *// плывет<br> * * * *¦¦ (C_BodyStateContains(self,BS_DIVE)) *// или ныряет<br> * * * *¦¦ (self.guild == GIL_STONEGOLEM) * * * // или Каменный голем<br> * * * *¦¦ (self.guild == GIL_ICEGOLEM) * * * * // или Ледяной голем<br> * * * *¦¦ (self.guild == GIL_FIREGOLEM) * * * *// или Огненный голем<br> * * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // или Вызванный голем<br> * * * *¦¦ (self.guild == GIL_DEMON) * * * * * *// или Демон<br> * * * *¦¦ (self.guild == GIL_SUMMONED_DEMON) * // или Вызванный демон<br> * * * *¦¦ (self.guild == GIL_TROLL) * * * * * *// или Троль<br> * * * *¦¦ (self.guild == GIL_BLOODFLY) * * * * // или Кровяной шершень<br> * * * *¦¦ (self.guild == GIL_DRAGON) * * * * * // или Дракон<br> * * * *¦¦ (self.guild == GIL_Gargoyle) * * * * // или Огненный дух мракориса<br> * * * *¦¦ (self.guild == GIL_DMT) * * * * * * *// или Черный маг<br> * * * *¦¦ (self.guild == GIL_STONEGUARDIAN) * *// или Каменный страж<br> * * * *¦¦ (C_NPCIsUndead(self) == TRUE) * * * *// или нежить<br> * * * *{<br> * * * * * *return COLL_DONOTHING; *<br> * * * *};<br> * * * *// если НПС монстр или охраняет ворота<br> * * * *if(self.guild > GIL_SEPERATOR_HUM) ¦¦ (C_NpcIsGateGuard(self) == TRUE)<br> * * * *{<br> * * * * * *return COLL_APPLYDAMAGE;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING;<br> * *};<br> * *// если заклинание "Крик мертвых"<br> * *if(spellType == SPL_Skull)<br> * *{<br> * * * *// если НПС обездвижен или плывет или ныряет или нежить<br> * * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE)) ¦¦ (C_NpcIsUndead(self))<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING;<br> * *};<br> * *// если заклинание "Порыв ветра"<br> * *if(spellType == SPL_WINDFIST)<br> * *{<br> * * * *// если расстояние между НПС > 10м<br> * * * *if(Npc_GetDistToNpc(other,self) >= 1000)<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING;<br> * *};<br> * *// если заклинание "Молния" или "Шаровая молния" или "Стрела сотрясения"<br> * *if(spellType == SPL_Zap) ¦¦ (spellType == SPL_ChargeZap) ¦¦ (spellType == SPL_Concussionbolt)<br> * *{<br> * * * *// если НПС обездвижен<br> * * * *if(C_NpcIsDown(self))<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *return COLL_APPLYDAMAGE ¦ COLL_DONTKILL;<br> * *};<br> * *// если нападающий Черный маг<br> * *if(other.guild == GIL_DMT) <br> * *{<br> * * * *// если заклинание "Огненный дождь" или "Шторм" или "Удар молнии"<br> * * * *if(spellType == SPL_Firerain) ¦¦ (spellType == SPL_Thunderstorm) ¦¦ (spellType == SPL_LightningFlash)<br> * * * *{<br> * * * * * *// если НПС Черный маг<br> * * * * * *if(self.guild == GIL_DMT)<br> * * * * * *{<br> * * * * * * * *return COLL_DONOTHING;<br> * * * * * *}<br> * * * * * *// если НПС ГГ<br> * * * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(hero))<br> * * * * * *{<br> * * * * * * * *return COLL_APPLYHALVEDAMAGE;<br> * * * * * *};<br> * * * *};<br> * * * *// если заклинание Большая огненная буря и НПС Черный маг<br> * * * *if(spellType == SPL_Firestorm) && (self.guild == GIL_DMT)<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * *};<br> * *// если заклинание Большой огненный шар или<br> * *if (spellType == SPL_ChargeFireball)<br> * *¦¦ (spellType == SPL_InstantFireball) * // или Огненный шар<br> * *¦¦ (spellType == SPL_Firerain) * * * * *// или Огненный дождь<br> * *¦¦ (spellType == SPL_Firebolt) * * * * *// или Огненная стрела<br> * *¦¦ (spellType == SPL_Firestorm) * * * * // или Большая огненная буря<br> * *¦¦ (spellType == SPL_Pyrokinesis) * * * // или Малая огненная буря<br> * *¦¦ (spellType == SPL_Deathbolt) * * * * // или Стрела смерти<br> * *¦¦ (spellType == SPL_Deathball) * * * * // или Шар смерти<br> * *{<br> * * * *// если НПС обездвижен или плывет или ныряет<br> * * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *// если НПС Огненный голем или<br> * * * *if (self.guild == GIL_FIREGOLEM) * * * *<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN) * * // Огненная ящерица<br> * * * *¦¦ (self.guild == GIL_GARGOYLE) * * * * * * * * * * // или Огненный дух мракориса<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE) * // или Огненный дракон<br> * * * *{<br> * * * * * *return COLL_APPLYHALVEDAMAGE;<br> * * * *}<br> * * * *// если НПС Ледяной голем или<br> * * * *if (self.guild == GIL_ICEGOLEM)<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE) * *// Ледяной дракон<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_ICEWOLF) * * * // или Ледяной волк<br> * * * *{<br> * * * * * *return COLL_APPLYDOUBLEDAMAGE;<br> * * * *};<br> * * * *// если НПС Каменный голем или<br> * * * *if (self.guild == GIL_STONEGOLEM)<br> * * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // Вызванный голем<br> * * * *¦¦ (self.guild == GIL_DEMON) * * * * * *// или Демон<br> * * * *¦¦ (self.guild == GIL_SUMMONED_DEMON) * // или Вызванный демон<br> * * * *¦¦ (self.guild == GIL_TROLL) * * * * * *// или Троль<br> * * * *¦¦ (self.guild == GIL_DRAGON) * * * * * // или Дракон<br> * * * *{ * <br> * * * * * *return COLL_APPLYDAMAGE;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING;<br> * *};<br> * *// если заклинание Ледяная глыба или Ледяная волна или Ледяная стрела<br> * *if(spellType *== SPL_IceCube) ¦¦ (spellTYpe *== SPL_IceWave) ¦¦ (spelltype *== SPL_Icebolt)<br> * *{<br> * * * *// если НПС обездвижен или плывет или ныряет<br> * * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *// если НПС Огненный голем или<br> * * * *if (self.guild == GIL_FIREGOLEM)<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN) * * // Огненная ящерица<br> * * * *¦¦ (self.guild == GIL_GARGOYLE) * * * * * * * * * * // или Огненный дух мракориса<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE) * // или Огненный дракон<br> * * * *{<br> * * * * * *return COLL_APPLYDOUBLEDAMAGE;<br> * * * *};<br> * * * *// если НПС Ледяной голем или<br> * * * *if (self.guild == GIL_ICEGOLEM)<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE) * *// Ледяной дракон<br> * * * *¦¦ (self.aivar[AIV_MM_REAL_ID] == ID_ICEWOLF) * * * // или Ледяной волк<br> * * * *{<br> * * * * * *return COLL_APPLYHALVEDAMAGE;<br> * * * *};<br> * * * *// если НПС Каменный голем или<br> * * * *if (self.guild == GIL_STONEGOLEM)<br> * * * *¦¦ (self.guild == GIL_SUMMONED_GOLEM) * // Вызванный голем<br> * * * *¦¦ (self.guild == GIL_DEMON) * * * * * *// или Демон<br> * * * *¦¦ (self.guild == GIL_SUMMONED_DEMON) * // или Вызванный демон<br> * * * *¦¦ (self.guild == GIL_TROLL) * * * * * *// или Троль<br> * * * *¦¦ (self.guild == GIL_DRAGON) * * * * * // или Дракон<br> * * * *{<br> * * * * * *return COLL_APPLYDAMAGE;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING;<br> * *};<br> * *// если заклинание Удар молнии<br> * *if (spellType == SPL_LightningFlash)<br> * *{<br> * * * *// если НПС обездвижен<br> * * * *if(C_NpcIsDown(self))<br> * * * *{<br> * * * * * *return COLL_DONOTHING; *<br> * * * *};<br> * * * *// если НПС плывет или ныряет<br> * * * *if(C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE))<br> * * * *{<br> * * * * * *COLL_APPLYDOUBLEDAMAGE;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING; * <br> * *};<br> * *// если заклинание Страх<br> * *if(spellType == SPL_Fear)<br> * *{<br> * * * *// если НПС не Огненный голем и<br> * * * *if (self.guild != GIL_FIREGOLEM)<br> * * * *&& (self.guild != GIL_ICEGOLEM) * * * * // не Ледяной голем<br> * * * *&& (self.guild != GIL_STONEGOLEM) * * * // и не Каменный голем<br> * * * *&& (self.guild != GIL_SUMMONED_GOLEM) * // и не Вызванный голем<br> * * * *&& (self.guild != GIL_SWAMPSHARK) * * * // и не Болотный голем<br> * * * *&& (self.guild != GIL_TROLL) * * * * * *// и не Троль<br> * * * *&& (!C_NpcIsEvil(self)) * * * * * * * * // и не источник зла<br> * * * *&& (C_NpcIsGateGuard(self) == FALSE) * *// и не охранник ворот<br> * * * *{<br> * * * * * *return COLL_DOEVERYTHING;<br> * * * *};<br> * * * *return COLL_DONOTHING;<br> * *};<br> * *// если заклинание Уничтожить нежить<br> * *if(spellType == SPL_DestroyUndead)<br> * *{<br> * * * *// если НПС нежить и жизнь НПС <= урону заклинания<br> * * * *if(C_NpcIsUndead(self)) && (self.attribute[ATR_HITPOINTS_MAX] <= SPL_Damage_DESTROYUNDEAD)<br> * * * *{ * <br> * * * * * *return COLL_DOEVERYTHING;<br> * * * *};<br> * * * *return COLL_DONOTHING;<br> * *};<br> * *// если заклинание Дым смерти<br> * *if(spellType == SPL_BreathOfDeath)<br> * *{<br> * * * *// если расстояние между НПС < 10м и НПС не нежить<br> * * * *if(Npc_GetDistToNpc(other,self) < 1000) && (!C_NpcIsUndead(self))<br> * * * *{<br> * * * * * *// если НПС дракон или НПС не ГГ<br> * * * * * *if(self.guild == GIL_DRAGON) ¦¦ (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(hero)) * *<br> * * * * * *{<br> * * * * * * * *return COLL_APPLYHALVEDAMAGE;<br> * * * * * *};<br> * * * * * *return COLL_DOEVERYTHING;<br> * * * *};<br> * * * *return COLL_DONOTHING;<br> * *};<br> * *// если заклинание Волна смерти<br> * *if(spellType == SPL_MassDeath)<br> * *{<br> * * * *// если НПС не нежить<br> * * * *if(!C_NpcIsUndead(self)) * *<br> * * * *{<br> * * * * * *// если НПС дракон<br> * * * * * *if(self.guild == GIL_DRAGON)<br> * * * * * *{<br> * * * * * * * *return COLL_APPLYHALVEDAMAGE;<br> * * * * * *};<br> * * * * * *return COLL_DOEVERYTHING;<br> * * * *};<br> * * * *return COLL_DONOTHING;<br> * *};<br> * *// если заклинание Святой удар<br> * *if(spellType == SPL_MasterOfDisaster)<br> * *{<br> * * * *// если НПС не обездвижен и не плывет и не ныряет и нежить<br> * * * *if(!C_NpcIsDown(self)) && (!C_BodyStateContains(self,BS_SWIM)) && (!C_BodyStateContains(self,BS_DIVE)) && (C_NpcIsEvil(self))<br> * * * *{<br> * * * * * *return COLL_DOEVERYTHING;<br> * * * *};<br> * * * *return COLL_DONOTHING;<br> * *};<br> * *// если заклинание Уменьшить монстра<br> * *if(spellType == SPL_Shrink)<br> * *{<br> * * * *// если НПС обездвижен или плывет или ныряет или дракон<br> * * * *if(C_NpcIsDown(self)) ¦¦ (C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE)) ¦¦ (self.guild == GIL_DRAGON)<br> * * * *{<br> * * * * * *return COLL_DONOTHING;<br> * * * *};<br> * * * *return COLL_DOEVERYTHING;<br> * *};<br> * *// если заклинание Святая стрела<br> * *if(spellType == SPL_PalHolyBolt)<br> * *{<br> * * * *// если НПС источник зла<br> * * * *if(C_NpcIsEvil(self))<br> * * * *{<br> * * * * * *return COLL_DOEVERYTHING;<br> * * * *};<br> * * * *return COLL_DONOTHING;<br> * *}<br> * *// если заклинание Разогнать дьяволов<br> * *else if(spellType == SPL_PalRepelEvil)<br> * *{<br> * * * *// если НПС источник зла<br> * * * *if(C_NpcIsEvil(self))<br> * * * *{<br> * * * * * *// если жизнь НПС <= ущербу заклинания<br> * * * * * *if(self.attribute[ATR_HITPOINTS_MAX] <= SPL_Damage_PalRepelEvil)<br> * * * * * *{<br> * * * * * * * *return COLL_DOEVERYTHING;<br> * * * * * *}<br> * * * * * *else <br> * * * * * *{<br> * * * * * * * *return COLL_APPLYHALVEDAMAGE;<br> * * * * * *};<br> * * * *};<br> * * * *return COLL_DONOTHING;<br> * *}<br> * *// если заклинание Уничтожить дьяволов<br> * *else if(spellType == SPL_PalDestroyEvil)<br> * *{<br> * * * *// если НПС источник зла и жизнь НПС <= ущербу заклинания<br> * * * *if(C_NpcIsEvil(self)) && (self.attribute[ATR_HITPOINTS_MAX] <= SPL_Damage_PalDestroyEvil)<br> * * * *{<br> * * * * * *return COLL_DOEVERYTHING;<br> * * * *};<br> * * * *return COLL_DONOTHING;<br> * *};<br> * *return COLL_DOEVERYTHING;<br>};<br><br>
|
Re: Уроки скриптологии
//************************************************** ************<br>****************<br>// Управление процессом инвестирования маны для всех заклинаний<br>//------------------------------------------------------------------------------<br>// Данная функция вызывается только экзешником<br>// self - кастующий НПС (агрессор)<br>// other - НПС цель<br>//************************************************** ****************************<br>//================================================== ===========<br>// Аргументы:<br>//-------------------------------------------------------------<br>// manaInvested - кол-во инвестируемой маны<br>// -------------------------------------------------------------<br>// Возвращаемое значение:<br>// Одна из констант, управляющая процессом инвестирования маны.<br>// ================================================== ===========<br><br>func int Spell_ProcessMana(var int manaInvested)<br>{<br> * *var int activeSpell;<br> * *// получить активное заклинание агрессора<br> * *activeSpell = Npc_GetActiveSpell(self);<br> * *// В зависимости от заклинания вызывается соответствующая функция, управляющая инвестированием маны<br> * *if(activeSpell == SPL_PalLight * * * * *) * { * return *Spell_Logic_PalLight * * * *(manaInvested); };<br> * *if(activeSpell == SPL_PalLightHeal * * *) * { * return *Spell_Logic_PalLightHeal * *(manaInvested); };<br> * *if(activeSpell == SPL_PalHolyBolt * * * ) * { * return *Spell_Logic_PalHolyBolt * * (manaInvested); };<br> * *if(activeSpell == SPL_PalMediumHeal * * ) * { * return *Spell_Logic_PalMediumHeal * (manaInvested); };<br> * *if(activeSpell == SPL_PalRepelEvil * * *) * { * return *Spell_Logic_PalRepelEvil * *(manaInvested); };<br> * *if(activeSpell == SPL_PalFullHeal * * * ) * { * return *Spell_Logic_PalFullHeal * * (manaInvested); };<br> * *if(activeSpell == SPL_PalDestroyEvil * *) * { * return *Spell_Logic_PalDestroyEvil *(manaInvested); };<br> * *if(activeSpell == SPL_PalTeleportSecret ) * { * return *Spell_Logic_PalTeleportSecret(manaInvested); };<br> * *if(activeSpell == SPL_TeleportSeaport * ) * { * return *Spell_Logic_TeleportSeaport (manaInvested); };<br> * *if(activeSpell == SPL_TeleportMonastery ) * { * return *Spell_Logic_TeleportMonastery(manaInvested); };<br> * *if(activeSpell == SPL_TeleportFarm * * *) * { * return *Spell_Logic_TeleportFarm * *(manaInvested); };<br> * *if(activeSpell == SPL_TeleportXardas * *) * { * return *Spell_Logic_TeleportXardas *(manaInvested); };<br> * *if(activeSpell == SPL_TeleportPassNW * *) * { * return *Spell_Logic_TeleportPassNW *(manaInvested); };<br> * *if(activeSpell == SPL_TeleportPassOW * *) * { * return *Spell_Logic_TeleportPassOW *(manaInvested); };<br> * *if(activeSpell == SPL_TeleportOC * * * *) * { * return *Spell_Logic_TeleportOC * * *(manaInvested); };<br> * *if(activeSpell == SPL_TeleportOWDemonTower) { * return *Spell_Logic_TeleportOWDemonTower(manaInvested); };<br> * *if(activeSpell == SPL_TeleportTaverne * ) * { * return *Spell_Logic_TeleportTaverne (manaInvested); };<br> * *if(activeSpell == SPL_LIGHT * * * * * * ) * { * return *Spell_Logic_Light * * * * * (manaInvested); };<br> * *if(activeSpell == SPL_Firebolt * * * * *) * { * return *Spell_Logic_Firebolt * * * *(manaInvested); };<br> * *if(activeSpell == SPL_Icebolt * * * * * ) * { * return *Spell_Logic_Icebolt * * * * (manaInvested); };<br> * *if(activeSpell == SPL_Zap * * * * * * * ) * { * return *Spell_Logic_Zap * * * * * * (manaInvested); };<br> * *if(activeSpell == SPL_LightHeal * * * * ) * { * return *Spell_Logic_LightHeal * * * (manaInvested); };<br> * *if(activeSpell == SPL_SummonGoblinSkeleton) { * return *Spell_Logic_SummonGoblinSkeleton(manaInvested); };<br> * *if(activeSpell == SPL_InstantFireball * ) * { * return *Spell_Logic_InstantFireball (manaInvested); };<br> * *if(activeSpell == SPL_SummonWolf * * * *) * { * return *Spell_Logic_SummonWolf * * *(manaInvested); };<br> * *if(activeSpell == SPL_WINDFIST * * * * *) * { * return *Spell_Logic_Windfist * * * *(manaInvested); };<br> * *if(activeSpell == SPL_Sleep * * * * * * ) * { * return *Spell_Logic_Sleep * * * * * (manaInvested); };<br> * *if(activeSpell == SPL_MediumHeal * * * *) * { * return *Spell_Logic_MediumHeal * * *(manaInvested); };<br> * *if(activeSpell == SPL_LightningFlash * *) * { * return *Spell_Logic_LightningFlash *(manaInvested); };<br> * *if(activeSpell == SPL_ChargeFireball * *) * { * return *Spell_Logic_ChargeFireball *(manaInvested); };<br> * *if(activeSpell == SPL_ChargeZap * * * * ) * { * return *Spell_Logic_ChargeZap * * * (manaInvested); };<br> * *if(activeSpell == SPL_SummonSkeleton * *) * { * return *Spell_Logic_SummonSkeleton *(manaInvested); };<br> * *if(activeSpell == SPL_Fear * * * * * * *) * { * return *Spell_Logic_Fear * * * * * *(manaInvested); };<br> * *if(activeSpell == SPL_IceCube * * * * * ) * { * return *Spell_Logic_IceCube * * * * (manaInvested); };<br> * *if(activeSpell == SPL_ChargeZap * * * * ) * { * return *Spell_Logic_ChargeZap * * * (manaInvested); };<br> * *if(activeSpell == SPL_SummonGolem * * * ) * { * return *Spell_Logic_SummonGolem * * (manaInvested); };<br> * *if(activeSpell == SPL_DestroyUndead * * ) * { * return *Spell_Logic_DestroyUndead * (manaInvested); };<br> * *if(activeSpell == SPL_Pyrokinesis * * * ) * { * return *Spell_Logic_Pyrokinesis * * (manaInvested); };<br> * *if(activeSpell == SPL_Firestorm * * * * ) * { * return *Spell_Logic_Firestorm * * * (manaInvested); };<br> * *if(activeSpell == SPL_IceWave * * * * * ) * { * return *Spell_Logic_IceWave * * * * (manaInvested); };<br> * *if(activeSpell == SPL_SummonDemon * * * ) * { * return *Spell_Logic_SummonDemon * * (manaInvested); };<br> * *if(activeSpell == SPL_FullHeal * * * * *) * { * return *Spell_Logic_FullHeal * * * *(manaInvested); };<br> * *if(activeSpell == SPL_Firerain * * * * *) * { * return *Spell_Logic_Firerain * * * *(manaInvested); };<br> * *if(activeSpell == SPL_BreathOfDeath * * ) * { * return *Spell_Logic_BreathOfDeath * (manaInvested); };<br> * *if(activeSpell == SPL_MassDeath * * * * ) * { * return *Spell_Logic_MassDeath * * * (manaInvested); };<br> * *if(activeSpell == SPL_ArmyOfDarkness * *) * { * return *Spell_Logic_ArmyOfDarkness *(manaInvested); };<br> * *if(activeSpell == SPL_Shrink * * * * * *) * { * return *Spell_Logic_Shrink * * * * *(manaInvested); };<br> * *if(activeSpell == SPL_TrfSheep * * * * *) * { * return *Spell_Logic_TrfSheep * * * *(manaInvested); };<br> * *if(activeSpell == SPL_TrfScavenger * * *) * { * return *Spell_Logic_TrfScavenger * *(manaInvested); };<br> * *if(activeSpell == SPL_TrfGiantRat * * * ) * { * return *Spell_Logic_TrfGiantRat * * (manaInvested); };<br> * *if(activeSpell == SPL_TrfGiantBug * * * ) * { * return *Spell_Logic_TrfGiantBug * * (manaInvested); };<br> * *if(activeSpell == SPL_TrfWolf * * * * * ) * { * return *Spell_Logic_TrfWolf * * * * (manaInvested); };<br> * *if(activeSpell == SPL_TrfWaran * * * * *) * { * return *Spell_Logic_TrfWaran * * * *(manaInvested); };<br> * *if(activeSpell == SPL_TrfSnapper * * * *) * { * return *Spell_Logic_TrfSnapper * * *(manaInvested); };<br> * *if(activeSpell == SPL_TrfWarg * * * * * ) * { * return *Spell_Logic_TrfWarg * * * * (manaInvested); };<br> * *if(activeSpell == SPL_TrfFireWaran * * *) * { * return *Spell_Logic_TrfFireWaran * *(manaInvested); };<br> * *if(activeSpell == SPL_TrfLurker * * * * ) * { * return *Spell_Logic_TrfLurker * * * (manaInvested); };<br> * *if(activeSpell == SPL_TrfShadowbeast * *) * { * return *Spell_Logic_TrfShadowbeast *(manaInvested); };<br> * *if(activeSpell == SPL_TrfDragonSnapper *) * { * return *Spell_Logic_TrfDragonSnapper(manaInvested); };<br> * *if(activeSpell == SPL_Charm * * * * * * ) * { * return *Spell_Logic_Charm * * * * * (manaInvested); };<br> * *if(activeSpell == SPL_MasterOfDisaster *) * { * return *Spell_Logic_MasterOfDisaster(manaInvested); };<br> * *if(activeSpell == SPL_ConcussionBolt * *) * { * return *Spell_Logic_ConcussionBolt *(manaInvested); };<br> * *if(activeSpell == SPL_Deathbolt * * * * ) * { * return *Spell_Logic_Deathbolt * * * (manaInvested); };<br> * *if(activeSpell == SPL_Deathball * * * * ) * { * return *Spell_Logic_Deathball * * * (manaInvested); };<br> * *if(activeSpell == SPL_Thunderstorm * * *) * { * return *Spell_Logic_Thunderstorm * *(manaInvested); };<br> * *if(activeSpell == SPL_Waterfist * * * * ) * { * return *Spell_Logic_Waterfist * * * (manaInvested); };<br> * *if(activeSpell == SPL_Whirlwind * * * * ) * { * return *Spell_Logic_Whirlwind * * * (manaInvested); };<br> * *if(activeSpell == SPL_Geyser * * * * * *) * { * return *Spell_Logic_Geyser * * * * *(manaInvested); };<br> * *if(activeSpell == SPL_Inflate * * * * * ) * { * return *Spell_Logic_Inflate * * * * (manaInvested); };<br> * *if(activeSpell == SPL_Icelance * * * * *) * { * return *Spell_Logic_Icelance * * * *(manaInvested); };<br> * *if(activeSpell == SPL_Swarm * * * * * * ) * { * return *Spell_Logic_Swarm * * * * * (manaInvested); };<br> * *if(activeSpell == SPL_Greententacle * * ) * { * return *Spell_Logic_Greententacle * (manaInvested); };<br> * *if(activeSpell == SPL_SummonGuardian * *) * { * return *Spell_Logic_SummonGuardian *(manaInvested); };<br> * *if(activeSpell == SPL_Energyball * * * *) * { * return *Spell_Logic_Energyball * * *(manaInvested); };<br> * *if(activeSpell == SPL_SuckEnergy * * * *) * { * return *Spell_Logic_SuckEnergy * * *(manaInvested); };<br> * *if(activeSpell == SPL_Skull * * * * * * ) * { * return *Spell_Logic_Skull * * * * * (manaInvested); };<br> * *if(activeSpell == SPL_SummonZombie * * *) * { * return *Spell_Logic_SummonZombie * *(manaInvested); };<br> * *if(activeSpell == SPL_SummonMud * * * * ) * { * return *Spell_Logic_SummonMud * * * (manaInvested); };<br> * *return SPL_SENDSTOP; // (Моя коррекция)<br>};<br><br>...ещё файл<br><br>//************************************************** ************<br>****************<br>//Управление процессом высвобождения инвестированной маны для заклинаний<br>//------------------------------------------------------------------------------<br>// Данная функция вызывается только экзешником<br>// self - кастующий НПС (агрессор)<br>//************************************************** ****************************<br><br>//================================================== ===========<br>// Аргументы:<br>//-------------------------------------------------------------<br>// manaInvested - кол-во высвобождаемой маны<br>//-------------------------------------------------------------<br>// Возвращаемое значение:<br>// Одна из констант, управляющая процессом инвестирования маны.<br>//================================================== ===========<br><br>func int Spell_ProcessMana_Release(var int manaInvested)<br>{<br> * *var int activeSpell;<br> * *// получить активное заклинание агрессора<br> * *activeSpell = Npc_GetActiveSpell(self);<br> * *// эти заклинания при освобождении маны всегда срабатывают<br> * *if (activeSpell == SPL_Pyrokinesis *) * { * return *SPL_SENDCAST; * };<br> * *if (activeSpell == SPL_ChargeFireball) *{ * return *SPL_SENDCAST; * };<br> * *if (activeSpell == SPL_ChargeZap * *) * { * return *SPL_SENDCAST; * };<br> * *if (activeSpell == SPL_WINDFIST * * ) * { * return *SPL_SENDCAST; * };<br> * *// все остальные заклинания завершаются без эффекта<br> * *return SPL_SENDSTOP;<br>};<br><br>...ещё файл<br><br>// ************************************************** ****************<br>// Прототип всех заклинаний (значения по умолчанию)<br>// ************************************************** ****************<br><br>PROTOTYPE C_Spell_Proto(C_Spell) <br>{<br> * *time_per_mana * * * * * * * = 500; * * * * * * *// Время в мс, требуемое для инвестирования маны на один уровень - 500мс<br> * *damage_per_level * * * * * *= 1; * * * * * * * *// Наносимый урон за уровень заклинания - 1 пункт<br> * *damageType * * * * * * * * *= DAM_MAGIC; * * * *// Тип повреждения - магия<br> * *spellType * * * * * * * * * = SPELL_BAD; * * * *// Категория заклинания - плохое<br> * *canTurnDuringInvest * * * * = 1; * * * * * * * *// Возможность поворота во время инвестирования маны - есть<br> * *canChangeTargetDuringInvest = 1; * * * * * * * *// Возможность выбора цели во время инвестирования маны - есть<br> * *isMultiEffect * * * * * * * = 0; * * * * * * * *// Возможность мультиэффектов заклинания - нет<br> * *targetCollectAlgo * * * * * = TARGET_COLLECT_FOCUS_FALLBACK_NONE; // Константа описания цели - цель визуальный объект в фокусе, при потере фокуса траектория устанавливается заклинанием<br> * *targetCollectType * * * * * = TARGET_TYPE_NPCS; // Тип цели заклинания - цель НПС<br> * *targetCollectRange * * * * *= 10000; * * * * * *// Дальность действия - 100м<br> * *targetCollectAzi * * * * * *= 60; * * * * * * * // Угол азимута - 60 градусов<br> * *targetCollectElev * * * * * = 60; * * * * * * * // Угол тангажа - 60 градусов<br>};<br><br><br>
|
Re: Уроки скриптологии
16. Заклинания.<br><br>Все файлы заклинаний расположены в директории ..\AI\Magic\Spells\<br>Все заклинания мы рассматривать не будем, разберем только основные типы и принципы работы.<br><br>Все заклинания состоят из следующих частей:<br>1. Объявление самого заклинания типа INSTANCE Spell_ххх(C_Spell_Proto) с инициализацией требуемых переменных, где ххх - название заклинания.<br>2. Функция, управляющая процессом инвестирования маны int Spell_Logic_ххх(var int manaInvested). Аргумент int manaInvested определяет кол-во инвестированной маны, функция возвращает одну из констант управления процессом инвестирования маны.<br>3. Функция вызова самого заклинания void Spell_Cast_ххх() (вызывается только экзешником). Имя ххх должно строго соответствовать ххх при объявлении инстанции.<br><br>// *******************************************<br>// Заклинание Свет<br>// *******************************************<br><br >const int SPL_Cost_LIGHT * * * *= 10; * // кол-во требуемой маны<br><br>const int SPL_Duration_LIGHT * *= 5; * *// время действия заклинания в минутах<br><br>// объявление заклинания с инициализацией<br>INSTANCE Spell_Light(C_Spell_Proto)<br>{<br> * *time_per_mana * * * * * = 500;<br> * *spelltype * * * * * * * = SPELL_NEUTRAL;<br> * *targetCollectAlgo * * * = TARGET_COLLECT_NONE;<br> * *targetCollectRange * * *= 0;<br> * *targetCollectAzi * * * *= 0;<br> * *targetCollectElev * * * = 0;<br>};<br><br>// функция инвестирования маны<br>func int Spell_Logic_Light(var int manaInvested)<br>{<br> * *// если активное заклинание свиток и есть требуемое кол-во маны<br> * *if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))<br> * *{<br> * * * *// старт заклинания<br> * * * *return SPL_SENDCAST;<br> * *}<br> * *// иначе, если руна и есть требуемое кол-во маны<br> * *else if (self.attribute[ATR_MANA] >= SPL_Cost_Light)<br> * *{ * <br> * * * *// старт заклинания<br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else // мало маны<br> * *{<br> * * * *// отмена заклинания<br> * * * *return SPL_SENDSTOP;<br> * *};<br>};<br><br>// вызов заклинания<br>func void Spell_Cast_Light()<br>{<br> * *// если свиток<br> * *if(Npc_GetActiveSpellIsScroll(self))<br> * *{<br> * * * *// уменьшение маны на стоимость свитков<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;<br> * *}<br> * *else // руна<br> * *{<br> * * * *// уменьшение маны на фактическую стоимость заклинания<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Light;<br> * *};<br> * *// изменить случайное число выбора заклинаний<br> * *self.aivar[AIV_SelectSpell] += 1;<br>};<br><br>По такому принципу работают большинство заклинаний, это:<br><br><br>SPL_PalLight * * * * * *//Святой свет, * * * * * * * * * * *// файл Spell_Light_Alle.d<br>SPL_PalLightHeal * * * *//Малое лечение паладина * * * * * *// файл Spell_Heal_Alle.d<br>SPL_PalMediumHeal * * * //Среднее лечение паладина<br>SPL_PalFullHeal * * * * //Сильное лечение паладина<br>SPL_LightHeal * * * * * //Лечить легкое ранение<br>SPL_MediumHeal * * * * *//Лечить среднее ранение<br>SPL_FullHeal * * * * * *//Лечить сильное ранение<br>SPL_PalHolyBolt * * * * //Святая стрела * * * * * * * * * * // файл Spell_PalHolyBolt.d<br>SPL_PalRepelEvil * * * *//Разогнать дьяволов * * * * * * * *// файл Spell_PalRepelEvil.d<br>SPL_PalDestroyEvil * * *//Уничтожить дьяволов * * * * * * * // файл Spell_PalDestroyEvil.d<br>SPL_Firebolt * * * * * *//Огненная стрела * * * * * * * * * // файл Spell_FireBolt.d<br>SPL_Zap * * * * * * * * //Молния * * * * * * * * * * * * * *// файл Spell_Zap.d<br>SPL_Icebolt * * * * * * //Ледяная стрела * * * * * * * * * *// файл Spell_IceBolt.d<br>SPL_InstantFireball * * //Огненный шар * * * * * * * * * * *// файл Spell_InstantFireball.d<br>SPL_LightningFlash * * *//Удар молнии * * * * * * * * * * * // файл Spell_LightningFlash.d<br>SPL_IceCube * * * * * * //Ледяная глыба * * * * * * * * * * // файл Spell_IceCube.d<br>SPL_DestroyUndead * * * //Уничтожить нежить * * * * * * * * // файл Spell_DestroyUndead.d<br>SPL_Firestorm * * * * * //Малая огненная буря * * * * * * * // файл Spell_Firestorm.d<br>SPL_IceWave * * * * * * //Ледяная волна * * * * * * * * * * // файл Spell_IceWave.d<br>SPL_Firerain * * * * * *//Огненный дождь * * * * * * * * * *// файл Spell_Firerain.d<br>SPL_BreathOfDeath * * * //Дым смерти * * * * * * * * * * * *// файл Spell_BreathOfDeath.d<br>SPL_MassDeath * * * * * //Волна смерти * * * * * * * * * * *// файл Spell_MassDeath.d<br>SPL_MasterOfDisaster * *//Святой удар * * * * * * * * * * * // файл Spell_MasterOfDisaster.d<br>SPL_Deathbolt * * * * * //Стрела смерти * * * * * * * * * * // файл Spell_DeathBolt.d<br>SPL_Deathball * * * * * //Шар смерти * * * * * * * * * * * *// файл Spell_DeathBall.d<br>SPL_ConcussionBolt * * *//Стрела сотрясения * * * * * * * * // файл Spell_ConcussionBolt.d<br>SPL_Thunderstorm * * * *//Шторм * * * * * * * * * * * * * * // файл Spell_Thunderstorm.d<br>SPL_Whirlwind * * * * * //Смерч * * * * * * * * * * * * * * // файл Spell_Whirlwind.d<br>SPL_WaterFist * * * * * //Кулак воды * * * * * * * * * * * *// файл Spell_WaterFist.d<br>SPL_IceLance * * * * * *//Ледяное копье * * * * * * * * * * // файл Spell_IceLance.d<br>SPL_Geyser * * * * * * *//Гейзер * * * * * * * * * * * * * *// файл Spell_Geyser.d<br>SPL_Swarm * * * * * * * //Рой * * * * * * * * * * * * * * * // файл Spell_Swarm.d<br>SPL_GreenTentacle * * * //Зеленые щупальца * * * * * * * * *// файл Spell_GreenTentacle.d<br>SPL_Energyball * * * * *//Шар энергии * * * * * * * * * * * // файл Spell_EnergyBall.d<br>SPL_SuckEnergy * * * * *//Украсть энергию * * * * * * * * * // файл Spell_SuckEnergy.d<br>SPL_Skull * * * * * * * //Крик мертвых * * * * * * * * * * *// файл Spell_Skull.d<br><br><br>Телепортация.<br>// *************************<br>// Заклинания телепортации<br>// *************************<br><br>// стоимость заклинаний<br>const int SPL_Cost_Teleport * * = 10;<br><br>// Вывод сообщения о недоступности телепорта<br>// -------------------------------------------------------<br>// Level - уровень на котором находится телепорт прибытия<br>func void B_PrintTeleportTooFarAway(var int Level)<br>{<br> * *// если телепортация на другой уровень<br> * *if(Level != CurrentLevel)<br> * *{<br> * * * *// вывод сообщения "Слишком далеко"<br> * * * *PrintScreen(PRINT_TeleportTooFarAway,-1,YPOS_LevelUp,FONT_ScreenSmall,2);<br> * *};<br>};<br><br>// Инициализация заклинаний<br>INSTANCE Spell_Teleport(C_Spell_Proto)<br>{<br> * *time_per_mana * * * * * = 0;<br> * *spelltype * * * * * * * = SPELL_NEUTRAL;<br> * *targetCollectAlgo * * * = TARGET_COLLECT_CASTER;<br> * *canTurnDuringInvest * * = 0;<br> * *targetCollectRange * * *= 0;<br> * *targetCollectAzi * * * *= 0;<br> * *targetCollectElev * * * = 0;<br>};<br><br>// Функции инвестирования маны для всех заклинаний телепортации идентичны ранее рассмотренной<br>func int Spell_Logic_PalTeleportSecret(var int manaInvested)<br>{<br> * *if (Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))<br> * *{<br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else if (self.attribute[ATR_MANA] >= SPL_Cost_Teleport)<br> * *{<br> * * * *return SPL_SENDCAST;<br> * *};<br> * *return SPL_NEXTLEVEL;<br>};<br><br>// Функции вызова заклинаний телепортации<br>func void Spell_Cast_PalTeleportSecret()<br>{<br> * *// вывод сообщения о недоступности телепорта<br> * *B_PrintTeleportTooFarAway(NEWWORLD_ZEN);<br> * *if (Npc_GetActiveSpellIsScroll(self))<br> * *{<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;<br> * *}<br> * *else<br> * *{<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Teleport;<br> * *};<br> * *// телепортация в нужную точку<br> * *AI_Teleport(self,"NW_PAL_SECRETCHAMBER" );<br> * *// анимация телепортации<br> * *AI_PlayAni(self,"T_HEASHOOT_2_STAND" );<br>};<br><br>// Остальные функции вызова заклинаний телепортации идентичны приведенной<br><br>// Вызов соответствующей функции телепортации в зависимости от активного заклинания<br>func void Spell_Cast_Teleport()<br>{<br> * *if (Npc_GetActiveSpell(self) == SPL_PalTeleportSecret * ) * { * Spell_Cast_PalTeleportSecret * *(); };<br> * *if (Npc_GetActiveSpell(self) == SPL_TeleportSeaport * * ) * { * Spell_Cast_TeleportSeaport * * *(); };<br> * *if (Npc_GetActiveSpell(self) == SPL_TeleportMonastery * ) * { * Spell_Cast_TeleportMonastery * *(); };<br> * *if (Npc_GetActiveSpell(self) == SPL_TeleportFarm * * * *) * { * Spell_Cast_TeleportFarm * * * * (); };<br> * *if (Npc_GetActiveSpell(self) == SPL_TeleportXardas * * *) * { * Spell_Cast_TeleportXardas * * * (); };<br> * *if (Npc_GetActiveSpell(self) == SPL_TeleportPassNW * * *) * { * Spell_Cast_TeleportPassNW * * * (); };<br> * *if (Npc_GetActiveSpell(self) == SPL_TeleportPassOW * * *) * { * Spell_Cast_TeleportPassOW * * * (); };<br> * *if (Npc_GetActiveSpell(self) == SPL_TeleportOC * * * * *) * { * Spell_Cast_TeleportOC * * * * * (); };<br> * *if (Npc_GetActiveSpell(self) == SPL_TeleportOWDemonTower) * { * Spell_Cast_TeleportOWDemonTower (); };<br> * *if (Npc_GetActiveSpell(self) == SPL_TeleportTaverne * * ) * { * Spell_Cast_TeleportTaverne * * *(); };<br>};<br><br>Заклинания вызова монстров рассмотрим на примере вызова Волка<br><br>// **************<br>// Вызов Волка<br>// **************<br><br>// стоимость заклинания<br>const int SPL_Cost_SummonWolf * = 40;<br><br>// Инициализация заклинания<br>INSTANCE Spell_SummonWolf(C_Spell_Proto)<br>{<br> * *time_per_mana * * * * * = 0;<br> * *targetCollectAlgo * * * = TARGET_COLLECT_NONE;<br>};<br><br>// Функция инвестирования маны идентична ранее рассмотренным<br>func int Spell_Logic_SummonWolf(var int manaInvested)<br>{<br> * *if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))<br> * *{<br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else if(self.attribute[ATR_MANA] >= SPL_Cost_SummonWolf)<br> * *{ * * * <br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else<br> * *{<br> * * * *return SPL_SENDSTOP;<br> * *};<br> * *<br>};<br><br>// Вызов заклинания<br>func void Spell_Cast_SummonWolf()<br>{<br> * *if(Npc_GetActiveSpellIsScroll(self))<br> * *{<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;<br> * *}<br> * *else<br> * *{<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonWolf;<br> * *};<br> * *// если заклинание применяет ГГ<br> * *if(Npc_IsPlayer(self)) <br> * *{<br> * * * *// рождение Вызванного волка (1 штука на 5 минут)<br> * * * *Wld_SpawnNpcRange(self,Summoned_Wolf,1,500);<br> * *}<br> * *else<br> * *{<br> * * * *// рождение Волка<br> * * * *Wld_SpawnNpcRange(self,Wolf,1,500);<br> * *};<br> * *self.aivar[AIV_SelectSpell] += 1;<br>};<br><br>По такому принципу работают заклинания:<br><br>SPL_SummonGoblinSkeleton * *//Вызвать скелет гоблина * * * *// файл Spell_SummonGoblinSkeleton.d<br>SPL_SummonSkeleton * * * * *//Вызвать скелет * * * * * * * *// файл Spell_SummonSkeleton.d<br>SPL_SummonGolem * * * * * * //Вызвать голема * * * * * * * *// файл Spell_SummonGolem.d<br>SPL_SummonDemon * * * * * * //Вызвать демона * * * * * * * *// файл Spell_SummonDemon.d<br>SPL_ArmyOfDarkness * * * * *//Армия мрака * * * * * * * * * // файл Spell_ArmyOfDarkness.d<br>SPL_SummonGuardian * * * * *//Создать стража * * * * * * * *// файл Spell_SummonGuardian.d<br>SPL_SummonZombie * * * * * *//Создать зомби * * * * * * * * // файл Spell_SummonZombie.d<br>SPL_SummonMud * * * * * * * //Вызвать Муда * * * * * * * * *// файл Spell_SummonMud.d<br><br>
|
Re: Уроки скриптологии
Заклинания, требующие несколько уровней инвестирования маны, рассмотрим на примере заклинания "Порыв ветра"<br><br>// ************************<br>// Заклинание Порыв ветра<br>// ************************<br><br>const int SPL_Cost_WindFist * * = 80; * // полная стоимость заклинания<br>const int STEP_WindFist * * * * = 20; * // стоимость одного уровня заклинания<br>const int SPL_Damage_WindFist * = 50; * // ущерб наносимый заклинанием на уровень<br><br>// объявление заклинания с инициализацией<br>INSTANCE Spell_WindFist(C_Spell_Proto)<br>{<br> * *time_per_mana * * * * * = 30;<br> * *damage_per_level * * * *= SPL_Damage_WindFist;<br> * *damageType * * * * * * *= DAM_FLY;<br> * *canTurnDuringInvest * * = TRUE;<br> * *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS_FALLBACK_NONE;<br> * *targetCollectRange * * *= 1000;<br> * *targetCollectType * * * = TARGET_TYPE_NPCS;<br>};<br><br>// функция инвестирования маны<br>func int Spell_Logic_WindFist(var int manaInvested)<br>{<br> * *// если недостаточно маны на уровень заклинания<br> * *if(self.attribute[ATR_MANA] < STEP_WindFist) <br> * *{<br> * * * *// инвестирование маны невозможно<br> * * * *return SPL_DONTINVEST;<br> * *};<br> * *// если инвестировано маны < 1 уровня<br> * *if(manaInvested <= STEP_WindFist*1)<br> * *{<br> * * * *// установить уровень 1<br> * * * *self.aivar[AIV_SpellLevel] = 1;<br> * * * *// инвестированной маны недостаточно для перехода на следующий уровень<br> * * * *return SPL_STATUS_CANINVEST_NO_MANADEC;<br> * *}<br> * *// если инвестировано маны > требуемой для 1 уровня и уровень не выше первого<br> * *else if(manaInvested > (STEP_WindFist*1)) && (self.aivar[AIV_SpellLevel] <= 1)<br> * *{<br> * * * *// уменьшение маны на уровень<br> * * * *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist);<br> * * * *// если мана < 0<br> * * * *if(self.attribute[ATR_MANA] < 0) <br> * * * *{<br> * * * * * *// мана = 0<br> * * * * * *self.attribute[ATR_MANA] = 0;<br> * * * *};<br> * * * *// установить уровень 2<br> * * * *self.aivar[AIV_SpellLevel] = 2;<br> * * * *// переход на следующий уровень<br> * * * *return SPL_NEXTLEVEL;<br> * *}<br> * *// аналогично приведенному выше для следующих уровней заклинания<br> * *else if(manaInvested > (STEP_WindFist*2)) && (self.aivar[AIV_SpellLevel] <= 2)<br> * *{<br> * * * *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist);<br> * * * *if(self.attribute[ATR_MANA] < 0)<br> * * * *{<br> * * * * * *self.attribute[ATR_MANA] = 0;<br> * * * *};<br> * * * *self.aivar[AIV_SpellLevel] = 3;<br> * * * *return SPL_NEXTLEVEL;<br> * *}<br> * *else if(manaInvested > (STEP_WindFist*3)) && (self.aivar[AIV_SpellLevel] <= 3)<br> * *{<br> * * * *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist);<br> * * * *if(self.attribute[ATR_MANA] < 0) <br> * * * *{<br> * * * * * *self.attribute[ATR_MANA] = 0;<br> * * * *};<br> * * * *self.aivar[AIV_SpellLevel] = 4;<br> * * * *return SPL_NEXTLEVEL;<br> * *}<br> * *// если достигнут последний уровень<br> * *else if(manaInvested > (STEP_WindFist*3)) && (self.aivar[AIV_SpellLevel] == 4)<br> * *{<br> * * * *// дальнейшее инвестирование маны невозможно<br> * * * *return SPL_DONTINVEST; *<br> * *};<br> * *// инвестированной маны недостаточно для перехода на следующий уровень<br> * *return SPL_STATUS_CANINVEST_NO_MANADEC;<br>};<br><br>// вызов заклинания<br>// где spellLevel - достигнутый уровень заклинания<br>func void Spell_Cast_WindFist(var int spellLevel)<br>{<br> * *// уменьшение маны для последнего уровня<br> * *self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_WindFist);<br> * *if(self.attribute[ATR_MANA] < 0) <br> * *{<br> * * * *self.attribute[ATR_MANA] = 0;<br> * *}; *<br> * *// изменить случайное число выбора заклинаний<br> * *self.aivar[AIV_SelectSpell] += 1;<br>};<br><br>По такому принципу работают следующие заклинания:<br><br>SPL_ChargeFireball * * *//Большой огненный шар * * * * * * *// файл Spell_ChargeFireball.d<br>SPL_ChargeZap * * * * * //Шаровая молния * * * * * * * * * *// файл Spell_ChargeZap.d<br>SPL_Pyrokinesis * * * * //Большая огненная буря * * * * * * // файл Spell_Pyrokinesis.d<br><br><br>Трансформация<br><br>// **************************<br>// Заклинания трансформации<br>// **************************<br><br>// стоимости заклинаний<br>const int SPL_Cost_TrfSheep * * * * = 10;<br>const int SPL_Cost_TrfScavenger * * = 10;<br>const int SPL_Cost_TrfGiantRat * * *= 10;<br>const int SPL_Cost_TrfGiantBug * * *= 10;<br>const int SPL_Cost_TrfWolf * * * * *= 10;<br>const int SPL_Cost_TrfWaran * * * * = 10;<br>const int SPL_Cost_TrfSnapper * * * = 10;<br>const int SPL_Cost_TrfWarg * * * * *= 10;<br>const int SPL_Cost_TrfFireWaran * * = 10;<br>const int SPL_Cost_TrfLurker * * * *= 10;<br>const int SPL_Cost_TrfShadowbeast * = 10;<br>const int SPL_Cost_TrfDragonSnapper = 10;<br><br>// общая инициализация для всех заклинаний<br>INSTANCE Spell_Transform(C_Spell_Proto)<br>{<br> * *time_per_mana * * * * * = 0;<br> * *spelltype * * * * * * * = SPELL_NEUTRAL;<br> * *targetCollectAlgo * * * = TARGET_COLLECT_NONE;<br> * *canTurnDuringInvest * * = 0;<br>};<br><br>// Функции инвестирования маны у всех заклинаний трансформации практически одинаковы, рассмотрим одну их них<br>func int Spell_Logic_TrfSheep(var int manaInvested)<br>{<br> * *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны<br> * *if((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll)))<br> * *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_TrfSheep)<br> * *{<br> * * * *// уменьшить ману на стоимость заклинания для руны<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_TrfSheep;<br> * * * *// ссылка на объявление (инстанцию) зверюшки, в которую превращаемся<br> * * * *Npc_SetActiveSpellInfo(self,Sheep);<br> * * * *// старт заклинания<br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else<br> * *{<br> * * * *// заклинание невозможно<br> * * * *return SPL_SENDSTOP;<br> * *};<br>};<br><br>Функция вызова заклинания здесь отсутствует, вызов выполняется экзешником напрямую.<br>
|
Re: Уроки скриптологии
Прочие заклинания.<br><br>// ****************<br>// Заклинание Сон<br>// ****************<br>// self - кастующий НПС<br>// other - НПС цель<br><br>const int SPL_Cost_Sleep * *= 30; * // стоимость маны * <br>const int SPL_TIME_Sleep * *= 30; * // время сна в сек<br><br>// Инициализация заклинания<br>instance Spell_Sleep(C_Spell_Proto)<br>{<br> * *time_per_mana * * * * * = 0;<br> * *spelltype * * * * * * * = SPELL_NEUTRAL;<br> * *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS;<br>};<br><br>// Функция инвестирования маны<br>func int Spell_Logic_Sleep(var int manaInvested)<br>{<br> * *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны<br> * *if((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll)))<br> * *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_Sleep)<br> * *{<br> * * * *// если свиток<br> * * * *if(Npc_GetActiveSpellIsScroll(self))<br> * * * *{<br> * * * * * *// израсходовать ману<br> * * * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;<br> * * * *}<br> * * * *else // руна<br> * * * *{<br> * * * * * *// израсходовать ману<br> * * * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Sleep;<br> * * * *};<br> * * * *// если цель не плывет и не ныряет и не обездвижена и<br> * * * *if (!C_BodyStateContains(other,BS_SWIM)) && (!C_BodyStateContains(other,BS_DIVE)) && (!C_NpcIsDown(other))<br> * * * *&& (other.guild < GIL_SEPERATOR_HUM) * * * *// человек<br> * * * *&& (other.flags != NPC_FLAG_IMMORTAL) * * * // и уязвима<br> * * * *&& (Npc_GetDistToNpc(self,other) <= 1000) * // и расстояние между кастующим и целью < 10м<br> * * * *&& (other.guild != GIL_KDF) * * * * * * * * // и цель не Маг огня<br> * * * *&& (other.guild != GIL_DMT) * * * * * * * * // и не Черный маг<br> * * * *&& (other.guild != GIL_PAL) * * * * * * * * // и не Паладин<br> * * * *{<br> * * * * * *// очистить очередь AI состояний цели<br> * * * * * *Npc_ClearAIQueue(other);<br> * * * * * *// очистить восприятия цели<br> * * * * * *B_ClearPerceptions(other);<br> * * * * * *// перевести цель в состояние Магического сна<br> * * * * * *AI_StartState(other,ZS_MagicSleep,0,"") ;<br> * * * *};<br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else<br> * *{<br> * * * *return SPL_SENDSTOP;<br> * *};<br>};<br><br>// Вызов заклинания<br>func void Spell_Cast_Sleep()<br>{<br> * *// изменить случайное число выбора заклинаний<br> * *self.aivar[AIV_SelectSpell] += 1;<br>};<br><br>...ещё файл<br><br>// *****************************<br>// Заклинание Уменьшить монстра<br>// *****************************<br><br>const int SPL_Cost_Shrink * = 300; // стоимость маны<br><br>// Инициализация заклинания<br>INSTANCE Spell_Shrink(C_Spell_Proto)<br>{<br> * *time_per_mana * * * * * = 0;<br> * *spelltype * * * * * * * = SPELL_NEUTRAL;<br> * *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS;<br> * *targetCollectRange * * *= 1000;<br>};<br><br>// Функция инвестирования маны (аналогична ранее рассмотренным)<br>func int Spell_Logic_Shrink(var int manaInvested)<br>{<br> * *if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))<br> * *{<br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else if(self.attribute[ATR_MANA] >= SPL_Cost_Shrink)<br> * *{<br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else<br> * *{<br> * * * *return SPL_SENDSTOP;<br> * *};<br>};<br><br>// Вызов заклинания<br>func void Spell_Cast_Shrink()<br>{<br> * *// если свиток<br> * *if(Npc_GetActiveSpellIsScroll(self))<br> * *{<br> * * * *// израсходовать ману для свитка<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;<br> * *}<br> * *else<br> * *{<br> * * * *// израсходовать ману для руны<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Shrink;<br> * *};<br> * *// если цель уязвима и не обездвижена и монстр и не уменьшена<br> * *if(other.flags != NPC_FLAG_IMMORTAL) && (!C_NpcIsUndead(other)) && (other.guild > GIL_SEPERATOR_HUM) && (other.aivar[AIV_MM_ShrinkState] == 0)<br> * *{<br> * * * *// очистить очередь AI состояний цели<br> * * * *Npc_ClearAIQueue(other);<br> * * * *// очистить восприятия цели<br> * * * *B_ClearPerceptions(other);<br> * * * *// перевести цель в состояние уменьшения<br> * * * *AI_StartState(other,ZS_MagicShrink,0,"" );<br> * *};<br> * *// изменить случайное число выбора заклинаний<br> * *self.aivar[AIV_SelectSpell] += 1;<br>};<br><br>...ещё файл<br><br>// *******************<br>// Заклинание Раздуть<br>// *******************<br><br>const int SPL_Cost_Inflate * * *= 10; * // стоимость маны<br>const int SPL_Inflate_Damage * *= 5; * *// ущерб от заклинания<br>const int SPL_TIME_Inflate * * *= 19; * // время действия 19 сек<br><br>// Инициализация заклинания<br>instance Spell_Inflate(C_Spell_Proto)<br>{<br> * *time_per_mana * * * * * = 0;<br> * *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS;<br>};<br><br>// Функция инвестирования маны<br>func int Spell_Logic_Inflate(var int manaInvested)<br>{<br> * *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны<br> * *if ((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll)))<br> * *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_Inflate)<br> * *{<br> * * * *// если свиток<br> * * * *if(Npc_GetActiveSpellIsScroll(self))<br> * * * *{<br> * * * * * *// израсходовать ману для свитка<br> * * * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// израсходовать ману для руны<br> * * * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Inflate;<br> * * * *};<br> * * * *// если цель не плывет и не ныряет и не обездвижена и <br> * * * *if(!C_BodyStateContains(other,BS_SWIM)) && (!C_BodyStateContains(other,BS_DIVE)) && (!C_NpcIsDown(other))<br> * * * *&& (other.guild < GIL_SEPERATOR_HUM) * * * *// человек<br> * * * *&& (other.flags != NPC_FLAG_IMMORTAL) * * * // и уязвима<br> * * * *&& (Npc_GetDistToNpc(self,other) <= 1000) * // и расстояние между кастующим и целью < 10м<br> * * * *&& (other.guild != GIL_KDF) * * * * * * * * // и цель не Маг огня<br> * * * *&& (other.guild != GIL_DMT) * * * * * * * * // и не Черный маг<br> * * * *&& (other.guild != GIL_PAL) * * * * * * * * // и не Паладин<br> * * * *{<br> * * * * * *// очистить очередь AI состояний цели<br> * * * * * *Npc_ClearAIQueue(other);<br> * * * * * *// очистить восприятия цели<br> * * * * * *B_ClearPerceptions(other);<br> * * * * * *// перевести цель в состояние Раздутия<br> * * * * * *AI_StartState(other,ZS_Inflate,0,"");<b r> * * * *};<br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else<br> * *{<br> * * * *return SPL_SENDSTOP;<br> * *};<br>};<br><br>// Вызов заклинания<br>func void Spell_Cast_Inflate()<br>{<br> * *// изменить случайное число выбора заклинаний<br> * *self.aivar[AIV_SelectSpell] += 1;<br>};<br><br>...ещё файл<br><br>// ******************<br>// Заклинание Страх<br>// ******************<br><br>const int SPL_Cost_Fear * * = 50; * // стоимость маны<br>const int SPL_TIME_Fear * * = 5; * *// время действия 5 сек<br><br>// Инициализация заклинания<br>INSTANCE Spell_Fear(C_Spell_Proto)<br>{<br> * *time_per_mana * * * * * = 0;<br> * *damage_per_level * * * *= 0;<br> * *targetCollectAlgo * * * = TARGET_COLLECT_NONE;<br>};<br><br>// Функция инвестирования маны (аналогична рассмотренным)<br>func int Spell_Logic_Fear(var int manaInvested)<br>{ * <br> * *if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))<br> * *{<br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else if(self.attribute[ATR_MANA] >= SPL_Cost_Fear)<br> * *{ * <br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else<br> * *{<br> * * * *return SPL_SENDSTOP;<br> * *};<br>};<br><br>// Вызов заклинания<br>func void Spell_Cast_Fear()<br>{<br> * *// если цель не Дракон<br> * *if(other.guild != GIL_DRAGON)<br> * *{<br> * * * *// перевести всех НПС, находящихся на расстоянии 10м от кастующего, в состояние страха<br> * * * *AI_SetNpcsToState(self,ZS_MagicFlee,1000);<br> * *};<br> * *// израсходовать ману (аналогично рассмотренным заклинаниям)<br> * *if(Npc_GetActiveSpellIsScroll(self))<br> * *{<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;<br> * *}<br> * *else<br> * *{<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Fear;<br> * *};<br> * *self.aivar[AIV_SelectSpell] += 1;<br>};<br><br>...ещё файл<br><br>// ******************<br>// Заклинание Забыть<br>// ******************<br><br>const int SPL_Cost_Charm * * * *= 50; * // стоимость маны<br>const int SPL_Damage_Charm * * *= 0; * *// причиняемый ущерб<br><br>// Инициализация заклинания<br>INSTANCE Spell_Charm(C_Spell_Proto)<br>{<br> * *time_per_mana * * * * * = 0;<br> * *spelltype * * * * * * * = SPELL_NEUTRAL;<br> * *damage_per_level * * * *= SPL_Damage_Charm;<br> * *damageType * * * * * * *= DAM_MAGIC;<br>};<br><br>// Функция инвестирования маны<br>func int Spell_Logic_Charm(var int manaInvested)<br>{<br> * *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны<br> * *if ((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll)))<br> * *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_Charm)<br> * *{<br> * * * *// если НПС цель видел криминал ГГ и квест Игназа в стадии выполнения<br> * * * *if(other.aivar[AIV_NpcSawPlayerCommit] != CRIME_NONE) && (MIS_Ignaz_Charm == LOG_RUNNING)<br> * * * *{<br> * * * * * *// тест заклинания проведен<br> * * * * * *Charm_Test = TRUE;<br> * * * *};<br> * * * *// удалить криминал ГГ для соответствующей локации<br> * * * *B_DeletePetzCrime(other);<br> * * * *// очистить что цель видела криминал<br> * * * *other.aivar[AIV_NpcSawPlayerCommit] = CRIME_NONE;<br> * * * *// последнего сражения с ГГ не было<br> * * * *other.aivar[AIV_LastFightAgainstPlayer] = FIGHT_NONE;<br> * * * *// если гильдии цели и кастующего не враги<br> * * * *if(Wld_GetGuildAttitude(other.guild,self.guild) != ATT_HOSTILE)<br> * * * *{ * <br> * * * * * *// если отношение цели и кастующего враждебно<br> * * * * * *if(Npc_GetAttitude(other,self) == ATT_HOSTILE)<br> * * * * * *{<br> * * * * * * * *// установить отношение цели к кастующему равное отношению их гильдий<br> * * * * * * * *Npc_SetTempAttitude(other,Wld_GetGuildAttitude(ot her.guild,self.guild));<br><br> * * * * * *};<br> * * * *};<br> * * * *return SPL_SENDCAST;<br> * *}<br> * *else<br> * *{<br> * * * *return SPL_SENDSTOP;<br> * *};<br>};<br><br>// Вызов заклинания (идентичен ранее рассмотренным)<br>func void Spell_Cast_Charm()<br>{<br> * *if(Npc_GetActiveSpellIsScroll(self))<br> * *{<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;<br> * *}<br> * *else<br> * *{<br> * * * *self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Charm;<br> * *};<br> * *self.aivar[AIV_SelectSpell] += 1;<br>};<br><br>
|
Re: Уроки скриптологии
2Нифариус:<br>
Цитата:
|
Re: Уроки скриптологии
2Jeene:<br>
Цитата:
Цитата:
|
Re: Уроки скриптологии
// **************************************<br>// Обработчик состояния Магический сон<br>// **************************************<br><br>// ----------------------------------------------------<br>// self - жертва заклинания<br>// other - кастующий НПС (агрессор)<br>// ----------------------------------------------------<br><br>// Локальное восприятие повреждения (окончание действия заклинания)<br>func int B_StopMagicSleep()<br>{<br> * *// запретить восприятие повреждений<br> * *Npc_PercDisable(self,PERC_ASSESSDAMAGE);<br> * *// жертва говорит агрессору (SVM фраза) "(сам с собою, просыпаясь) Что это было!?" (Примечание: Ошибка слово $WHATWASSTHAT надо заменить на $WHATWASTHAT, а то фраза не будет сказана)<br> * *B_Say_Overlay(self,other,"$WHATWASSTHAT" ;);<br> * *// анимация перехода в нормальное состояние<br> * *AI_PlayAni(self,"T_VICTIM_SLE_2_STAND") ;<br>}; * * *<br><br>// Локальное восприятие разговора<br>func void B_AssessMagicSleepTalk()<br>{<br> * *// жертва говорит агрессору (SVM фраза) "(просыпаясь) Черт, что случилось?"<br> * *B_Say(self,other,"$YOUDISTURBEDMYSLUMBER&quo t;);<br> * *// жертва переходит в состояние наблюдения за ГГ<br> * *AI_StartState(self,ZS_ObservePlayer,1,"" ;);<br>};<br><br>// Инициализация состояния<br>func void ZS_MagicSleep()<br>{<br> * *// установить локальное восприятие повреждения<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_StopMagic Sleep);<br> * *// разрешить восприятие магии<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// установить локальное восприятие разговора<br> * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessMagic SleepTalk);<br> * *// Сбросить статус предупреждений охраной<br> * *self.aivar[AIV_Guardpassage_Status] = GP_NONE;<br> * *// сбросить счетчик отказа от диалога<br> * *Npc_SetRefuseTalk(self,0);<br> * *// установить временное отношение между жертвой и ГГ равное постоянному<br> * *Npc_SetTempAttitude(self,Npc_GetPermAttitude(self ,hero));<br> * *// НПС и ГГ перестают смотреть друг на друга<br> * *B_StopLookAt(self);<br> * *// НПС прекращает на что-либо указывать<br> * *AI_StopPointAt(self);<br> * *// если состояние тела НПС не прерываемо<br> * *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))< br> * *{<br> * * * *// НПС встает<br> * * * *AI_StandUp(self);<br> * *}<br> * *else<br> * *{<br> * * * *// НПС быстро встает<br> * * * *AI_StandUpQuick(self);<br> * *};<br> * *// проигрывается анимация перехода в Магический сон<br> * *AI_PlayAniBS(self,"T_STAND_2_VICTIM_SLE" ;,BS_LIE );<br>};<br><br>// Функция цикла состояния<br>func int ZS_MagicSleep_Loop()<br>{ * <br> * *// если время в состоянии > времени действия заклинания<br> * *if(Npc_GetStateTime(self) > SPL_Time_Sleep)<br> * *{<br> * * * *// очистить очередь AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// закончить действие обработчика<br> * * * *B_StopMagicSleep();<br> * * * *return LOOP_END;<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_MagicSleep_End()<br>{<br>};<br><br>... ещё файл<br><br>// ************************************************** *********<br>// Обработчик состояния Большой огненной бури<br>// -----------------------------------------------------------<br>// В это состояние НПС переводится экзешником, а не скриптами<br>// ************************************************** *********<br><br>// ----------------------------------------------------<br>// self - жертва заклинания<br>// other - кастующий НПС (агрессор)<br>// ----------------------------------------------------<br><br>// Закончить действие заклинания<br>func void B_StopPyro()<br>{ * <br> * *// возвратить общую функцию состояния реакции на магию<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// очистить очередь AI состояний НПС<br> * *Npc_ClearAIQueue(self);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// если жертва человек<br> * *if(self.guild < GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// реакция НПС на повреждение<br> * * * *B_AssessDamage();<br> * * * *// продолжить распорядок дня НПС (т.к. не было принудительного перевода НПС в это состояние из скриптов и завершение этого состояния выполняется не из цикла состояния)<br> * * * *AI_ContinueRoutine(self);<br> * *}<br> * *else<br> * *{<br> * * * *// установить временно враждебное отношение НПС к ГГ<br> * * * *Npc_SetTempAttitude(self,ATT_HOSTILE);<br> * * * *// продолжить распорядок дня НПС<br> * * * *AI_ContinueRoutine(self);<br> * *};<br>}; *<br><br>// Инициализация состояния<br>func void ZS_Pyro()<br>{<br> * *// установить восприятие прекращения действия магии<br> * *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopPy ro);<br> * *// если состояние тела НПС не прерываемо<br> * *if(!Npc_HasBodyFlag(self, BS_FLAG_INTERRUPTABLE))<br> * *{<br> * * * *// НПС встает<br> * * * *AI_StandUp(self);<br> * *}<br> * *else<br> * *{<br> * * * *// НПС быстро встает<br> * * * *AI_StandUpQuick(self);<br> * *};<br> * *// если жертва человек<br> * *if(self.guild < GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// проиграть анимацию входа в состояние<br> * * * *AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM& quot;);<br> * *}; *<br>};<br><br>// Функция цикла состояния<br>func int ZS_Pyro_Loop()<br>{ * <br> * *// если прошла 1 секунда<br> * *if(Npc_GetStateTime(self) >= 1)<br> * *{<br> * * * *// сбросить время состояния<br> * * * *Npc_SetStateTime(self,0);<br> * * * *// нанести жертве секундный урон<br> * * * *B_MagicHurtNpc(other,self,SPL_PYRO_DAMAGE_PER_SEC );<br> * * * *// если жизнь жертвы кончилась<br> * * * *if(self.attribute[ATR_HITPOINTS] <= 0)<br> * * * *{<br> * * * * * *// очистить очередь AI состояний НПС<br> * * * * * *Npc_ClearAIQueue(self); * * <br> * * * * * *// НПС встает<br> * * * * * *AI_StandUp(self);<br> * * * * * *return LOOP_END;<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Pyro_End()<br>{<br>};<br><br>... ещё файл<br><br>// ************************************************<b r>// Обработчик состояния реакции на Шаровую молнию<br>// ************************************************<b r><br>// ----------------------------------------------------<br>// self - жертва заклинания<br>// other - кастующий НПС (агрессор)<br>// ----------------------------------------------------<br><br>// Закончить действие заклинания<br>func void B_StopShortZapped()<br>{ * <br> * *// возвратить общую функцию состояния реакции на магию<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// очистить очередь AI состояний НПС<br> * *Npc_ClearAIQueue(self);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// если жертва человек<br> * *if(self.guild < GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// реакция НПС на повреждение<br> * * * *B_AssessDamage();<br> * * * *// продолжить распорядок дня НПС (т.к. завершение этого состояния выполняется не из цикла состояния)<br> * * * *AI_ContinueRoutine(self);<br> * *}<br> * *else<br> * *{<br> * * * *// установить временно враждебное отношение НПС к ГГ<br> * * * *Npc_SetTempAttitude(self,ATT_HOSTILE);<br> * * * *// продолжить распорядок дня НПС<br> * * * *AI_ContinueRoutine(self);<br> * *};<br>}; * * *<br><br>// Инициализация состояния<br>func void ZS_ShortZapped()<br>{<br> * *// установить восприятие прекращения действия магии<br> * *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopSh ortZapped);<br> * *// если состояние тела НПС не прерываемо<br> * *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))< br> * *{<br> * * * *// НПС встает<br> * * * *AI_StandUp(self);<br> * *}<br> * *else<br> * *{<br> * * * *// НПС быстро встает<br> * * * *AI_StandUpQuick(self);<br> * *};<br> * *// если жертва человек<br> * *if(self.guild < GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// проиграть анимацию входа в состояние<br> * * * *AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM& quot;);<br> * *}; *<br>};<br><br>// Функция цикла состояния<br>func int ZS_ShortZapped_Loop()<br>{ * <br> * *// если время в состоянии > времени действия заклинания<br> * *if(Npc_GetStateTime(self) > SPL_TIME_SHORTZAPPED) * <br> * *{<br> * * * *// закончить действие обработчика<br> * * * *B_StopShortZapped();<br> * * * *return LOOP_END;<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_ShortZapped_End()<br>{<br>};<br><br>... ещё файл<br><br>// *************************************<br>// Обработчик состояния Украсть энергию<br>// *************************************<br><br>// ----------------------------------------------------<br>// self - жертва заклинания<br>// other - кастующий НПС (агрессор)<br>// ----------------------------------------------------<br><br>var int Temp_SuckEnergy_DistToPlayer; * // расстояние между жертвой и ГГ<br><br>// Функция реакции на локальное восприятие магии (заклинания)<br>func void B_RestartSuckEnergy()<br>{<br> * *// если последнее примененное заклинание Украсть энергию<br> * *if(Npc_GetLastHitSpellID(self) == SPL_SuckEnergy)<br> * *{<br> * * * *// сбросить время нахождения НПС в этом состоянии<br> * * * *Npc_SetStateTime(self,0);<br> * * * *// анимация состояния<br> * * * *AI_PlayAni(self,"T_STAND_2_SUCKENERGY_VICTIM ");<br> * *};<br>};<br><br>// Закончить действие заклинания<br>func void B_StopSuckEnergy()<br>{ * <br> * *// возвратить общую функцию состояния реакции на магию<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// очистить очередь AI состояний НПС<br> * *Npc_ClearAIQueue(self);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// если жертва человек<br> * *if(self.guild < GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// реакция НПС на повреждение<br> * * * *B_AssessDamage();<br> * *}<br> * *else<br> * *{<br> * * * *// установить временно враждебное отношение НПС к ГГ<br> * * * *Npc_SetTempAttitude(self,ATT_HOSTILE);<br> * *};<br>};<br><br>// Инициализация состояния<br>func void ZS_SuckEnergy()<br>{<br> * *// установить локальное восприятие на магию<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartSuc kEnergy);<br> * *// остановить проигрывание файла анимации заклинания<br> * *Npc_StopAni(self, "S_SUCKENERGY_VICTIM"); * <br> * *// очистить очередь AI состояний НПС<br> * *Npc_ClearAIQueue(self);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// сброс времени цикла<br> * *self.aivar[AIV_SuckEnergyStateTime] = 1;<br> * *// запомнить расстояние между жертвой и ГГ<br> * *Temp_SuckEnergy_DistToPlayer = Npc_GetDistToPlayer(self);<br>};<br><br>// Функция цикла состояния<br>func int ZS_SuckEnergy_Loop()<br>{ * <br> * *// если время в состоянии > времени действия заклинания или расстояние между ГГ и жертвой увеличилось на более 10м<br> * *if(Npc_GetStateTime(self) > SPL_TIME_SuckEnergy) ¦¦ (Temp_SuckEnergy_DistToPlayer >= Npc_GetDistToPlayer(self) + 100)<br> * *{<br> * * * *// остановить действие заклинания<br> * * * *B_StopSuckEnergy();<br> * * * *return LOOP_END;<br> * *};<br> * *// если текущее время состояния не равно времени цикла<br> * *if(Npc_GetStateTime(self) != self.aivar[AIV_SuckEnergyStateTime])<br> * *{<br> * * * *// если первая фаза состояния<br> * * * *if(Npc_GetStateTime(self) == 0) *<br> * * * *{<br> * * * * * *// если состояние тела НПС не прерываемо<br> * * * * * *if(!C_BodyStateContains(self, BS_UNCONSCIOUS)) <br> * * * * * *{<br> * * * * * * * *// анимация перехода в бессознательное состояние<br> * * * * * * * *AI_PlayAniBS(self,"T_STAND_2_SUCKENERGY_VICT IM",BS_UNCONSCIOUS);<br> * * * * * *};<br> * * * * * *// эффект высасывания энергии<br> * * * * * *Wld_PlayEffect("spellFX_SuckEnergy_BloodFly& quot;,self,hero,0,0,0,FAL<br>SE);<br> * * * *};<br> * * * *// обновить время цикла<br> * * * *self.aivar[AIV_SuckEnergyStateTime] = Npc_GetStateTime(self);<br> * * * *// если жизнь жертвы > ущерба от заклинания<br> * * * *if(self.attribute[ATR_HITPOINTS] > SPL_SuckEnergy_DAMAGE)<br> * * * *{<br> * * * * * *// нанести жертве урон<br> * * * * * *B_MagicHurtNpc(other,self,SPL_SuckEnergy_DAMAGE); <br> * * * * * *// добавить украденную жизнь агрессору<br> * * * * * *Npc_ChangeAttribute(other,ATR_HITPOINTS,SPL_SuckE nergy_DAMAGE);<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// убить жертву<br> * * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1);<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_SuckEnergy_End()<br>{<br>};<br><br>
|
Re: Уроки скриптологии
// *************************************<br>// Обработчик состояния заклинания Рой<br>// *************************************<br><br>// ----------------------------------------------------<br>// self - жертва заклинания<br>// other - кастующий НПС (агрессор)<br>// ----------------------------------------------------<br><br>// Функция реакции на локальное восприятие магии<br>func void B_RestartSwarm()<br>{<br> * *// если последнее примененное заклинание Рой<br> * *if(Npc_GetLastHitSpellID(self) == SPL_Swarm)<br> * *{<br> * * * *// сбросить время нахождения НПС в этом состоянии<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br>};<br><br>// Закончить действие заклинания<br>func void B_StopSwarm()<br>{ * <br> * *// возвратить общую функцию состояния реакции на магию<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// очистить очередь AI состояний НПС<br> * *Npc_ClearAIQueue(self);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// если жертва человек<br> * *if (self.guild < GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// реакция НПС на повреждение<br> * * * *B_AssessDamage();<br> * *}<br> * *else<br> * *{<br> * * * *// установить временно враждебное отношение НПС к ГГ<br> * * * *Npc_SetTempAttitude(self,ATT_HOSTILE);<br> * *};<br>};<br><br>// Инициализация состояния<br>func void ZS_Swarm()<br>{<br> * *// установить локальное восприятие на магию<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartSwa rm);<br> * *// остановить проигрывание файла анимации заклинания<br> * *Npc_StopAni(self,"S_SWARM_VICTIM");<br> * *// очистить очередь AI состояний НПС<br> * *Npc_ClearAIQueue(self);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// если состояние тела НПС не прерываемо<br> * *if(!C_BodyStateContains(self,BS_UNCONSCIOUS)) <br> * *{<br> * * * *// анимация перехода в бессознательное состояние<br> * * * *AI_PlayAniBS(self,"T_STAND_2_SWARM_VICTIM&qu ot;,BS_UNCONSCIOUS);<br> * *};<br> * *// сброс времени цикла<br> * *self.aivar[AIV_SwarmStateTime] = 0;<br>};<br><br>// Функция цикла состояния<br>func int ZS_Swarm_Loop ()<br>{ * <br> * *// если время в состоянии > времени действия заклинания<br> * *if(Npc_GetStateTime(self) > SPL_TIME_Swarm)<br> * *{<br> * * * *// остановить действие заклинания<br> * * * *B_StopSwarm();<br> * * * *return LOOP_END;<br> * *};<br> * *// если прошла 1 сек<br> * *if(Npc_GetStateTime(self) != self.aivar[AIV_SwarmStateTime])<br> * *{<br> * * * *// если жертва находится в состоянии 2 сек<br> * * * *if(Npc_GetStateTime(self) == 2) <br> * * * *{ *<br> * * * * * *// жертва говорит агрессору (SVM фраза) "Ах, черт!"<br> * * * * * *B_Say(self,other,"$RunAway");<br> * * * *}<br> * * * *// через 6 сек<br> * * * *else if(Npc_GetStateTime(self) == 6) <br> * * * *{ <br> * * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"<br> * * * * * *B_Say(self,other,"$Aargh_2");<br> * * * *}<br> * * * *// через 7 сек<br> * * * *else if(Npc_GetStateTime(self) == 7)<br> * * * *{<br> * * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"<br> * * * * * *B_Say (self,other,"$Aargh_3");<br> * * * *}<br> * * * *// через 8 сек<br> * * * *else if(Npc_GetStateTime(self) == 8 )<br> * * * *{<br> * * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!"<br> * * * * * *B_Say(self,other,"$Aargh_1");<br> * * * *};<br> * * * *// установить счетчик цикла на текущее время<br> * * * *self.aivar[AIV_SwarmStateTime] = Npc_GetStateTime(self);<br> * * * *// если жизнь жертвы > ущерба от заклинания<br> * * * *if(self.attribute[ATR_HITPOINTS] > SPL_Swarm_DAMAGE)<br> * * * *{<br> * * * * * *// нанести жертве урон<br> * * * * * *B_MagicHurtNpc(other,self,SPL_Swarm_DAMAGE);<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// убить жертву<br> * * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1);<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Swarm_End()<br>{<br>};<br><br>... ещё файл<br><br>// ******************************************<br>// Обработчик состояния заклинания Смерч<br>// ******************************************<br><br>// ----------------------------------------------------<br>// self - жертва заклинания<br>// other - кастующий НПС (агрессор)<br>// ----------------------------------------------------<br><br>// Функция реакции на локальное восприятие магии<br>func void B_RestartWhirlwind()<br>{<br> * *// если последнее примененное заклинание Смерч<br> * *if(Npc_GetLastHitSpellID(self) == SPL_Whirlwind)<br> * *{<br> * * * *// сбросить время нахождения НПС в этом состоянии<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br>};<br><br>// Закончить действие заклинания<br>func void B_StopWhirlwind()<br>{ * <br> * *// возвратить общую функцию состояния реакции на магию<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// очистить очередь AI состояний НПС<br> * *Npc_ClearAIQueue(self);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// если жертва человек<br> * *if(self.guild < GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// реакция НПС на повреждение<br> * * * *B_AssessDamage();<br> * *}<br> * *else<br> * *{<br> * * * *// установить временно враждебное отношение НПС к ГГ<br> * * * *Npc_SetTempAttitude(self,ATT_HOSTILE);<br> * *};<br>};<br><br>// Инициализация состояния<br>func void ZS_Whirlwind()<br>{<br> * *// установить локальное восприятие на магию<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartWhi rlwind);<br> * *// остановить проигрывание файла анимации заклинания<br> * *Npc_StopAni(self,"S_WHIRLWIND_VICTIM"); <br> * *// очистить очередь AI состояний НПС<br> * *Npc_ClearAIQueue(self);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// если состояние тела НПС не прерываемо<br> * *if(!C_BodyStateContains(self, BS_UNCONSCIOUS)) <br> * *{<br> * * * *// анимация перехода в бессознательное состояние<br> * * * *AI_PlayAniBS(self,"T_STAND_2_WHIRLWIND_VICTI M",BS_UNCONSCIOUS);<br> * *};<br> * *// сброс счетчика цикла<br> * *self.aivar[AIV_WhirlwindStateTime] = 0;<br>};<br><br>// Функция цикла состояния<br>func int ZS_Whirlwind_Loop ()<br>{ * <br> * *// если время в состоянии > времени действия заклинания<br> * *if(Npc_GetStateTime(self) > SPL_TIME_WHIRLWIND)<br> * *{<br> * * * *// остановить действие заклинания<br> * * * *B_StopWhirlwind();<br> * * * *return LOOP_END;<br> * *};<br> * *// если прошла 1 сек<br> * *if(Npc_GetStateTime(self) != self.aivar[AIV_WhirlwindStateTime])<br> * *{<br> * * * *// установить счетчик цикла на текущее время<br> * * * *self.aivar[AIV_WhirlwindStateTime] = Npc_GetStateTime(self);<br> * * * *// если жизнь жертвы > ущерба от заклинания<br> * * * *if(self.attribute[ATR_HITPOINTS] > SPL_Whirlwind_DAMAGE)<br> * * * *{<br> * * * * * *// нанести жертве урон<br> * * * * * *B_MagicHurtNpc(other,self,SPL_Whirlwind_DAMAGE);< br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// убить жертву<br> * * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1);<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Whirlwind_End()<br>{<br>};<br><br>... ещё файл<br><br>// ************************************************** *********<br>// Обработчик состояния Удар молнии<br>// -----------------------------------------------------------<br>// В это состояние НПС переводится экзешником, а не скриптами<br>// ************************************************** *********<br><br>// ----------------------------------------------------<br>// self - жертва заклинания<br>// other - кастующий НПС (агрессор)<br>// ----------------------------------------------------<br><br>// Закончить действие заклинания<br>func void B_StopZapped()<br>{ * <br> * *// возвратить общую функцию состояния реакции на магию<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// очистить очередь AI состояний НПС<br> * *Npc_ClearAIQueue(self);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// если жертва человек<br> * *if(self.guild < GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// реакция НПС на повреждение<br> * * * *B_AssessDamage();<br> * * * *// продолжить распорядок дня НПС (т.к. не было принудительного перевода НПС в это состояние из скриптов и завершение этого состояния выполняется не из цикла состояния)<br> * * * *AI_ContinueRoutine(self);<br> * *}<br> * *else<br> * *{<br> * * * *// установить временно враждебное отношение НПС к ГГ<br> * * * *Npc_SetTempAttitude(self,ATT_HOSTILE);<br> * * * *// продолжить распорядок дня НПС<br> * * * *AI_ContinueRoutine(self);<br> * *};<br>};<br><br>// Инициализация состояния<br>func void ZS_Zapped()<br>{<br> * *// установить восприятие прекращения действия магии<br> * *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopZa pped);<br> * *// если состояние тела НПС не прерываемо<br> * *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))< br> * *{<br> * * * *// НПС встает<br> * * * *AI_StandUp(self);<br> * *}<br> * *else<br> * *{<br> * * * *// НПС быстро встает<br> * * * *AI_StandUpQuick(self);<br> * *};<br> * *// если жертва человек<br> * *if(self.guild < GIL_SEPERATOR_HUM)<br> * *{<br> * * * *// включить анимацию действия заклинания<br> * * * *AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM& quot;);<br> * *}; *<br>};<br><br>// Функция цикла состояния<br>func int ZS_Zapped_Loop()<br>{ * <br> * *// если прошла 1 секунда<br> * *if(Npc_GetStateTime(self) >= 1)<br> * *{<br> * * * *// сбросить время состояния<br> * * * *Npc_SetStateTime(self,0);<br> * * * *// нанести жертве секундный урон<br> * * * *B_MagicHurtNpc(other,self,SPL_ZAPPED_DAMAGE_PER_S EC);<br> * * * *// если жизнь жертвы кончилась<br> * * * *if(self.attribute[ATR_HITPOINTS] <= 0)<br> * * * *{<br> * * * * * *// очистить очередь AI состояний НПС<br> * * * * * *Npc_ClearAIQueue(self); * * <br> * * * * * *// НПС встает<br> * * * * * *AI_StandUp(self);<br> * * * * * *return LOOP_END;<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Zapped_End()<br>{<br>};<br><br>
|
Re: Уроки скриптологии
18. Разные AI функции.<br><br>// ***********************************************<br >// Функция обновления снаряжения при респавне НПС<br>// -----------------------------------------------<br>// Вызывается только экзешником<br>// ***********************************************<br ><br>// -----------------------------------------------<br>// self - возрождаемый НПС<br>// -----------------------------------------------<br><br>func void B_RefreshAtInsert()<br>{<br> * *// если НПС мертв<br> * *if(self.attribute[ATR_HITPOINTS] <= 0)<br> * *{<br> * * * *return;<br> * *};<br> * *var C_NPC her;<br> * *// получить ссылку на ГГ<br> * *her = Hlp_GetNpc(PC_Hero); <br> * *// если НПС человек и НПС не ГГ<br> * *if(self.guild < GIL_SEPERATOR_HUM) && (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(her))<br> * *{<br> * * * *// установить текущую жизнь равной максимальной<br> * * * *self.attribute[ATR_HITPOINTS] = self.attribute[ATR_HITPOINTS_MAX];<br> * * * *// если НПС не имеет никакого оружия<br> * * * *if(Npc_HasEquippedWeapon(self) == FALSE)<br> * * * *{<br> * * * * * *// если НПС милиционер<br> * * * * * *if(self.guild == GIL_MIL) * <br> * * * * * *{<br> * * * * * * * *// создать в инвентаре Тяжелую палку<br> * * * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1);<br> * * * * * *};<br> * * * * * *// если НПС паладин<br> * * * * * *if(self.guild == GIL_PAL) * <br> * * * * * *{ * <br> * * * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1);<br> * * * * * *};<br> * * * * * *// если НПС наемник<br> * * * * * *if(self.guild == GIL_SLD) * <br> * * * * * *{ * <br> * * * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1);<br> * * * * * *};<br> * * * * * *// если НПС крестьянин<br> * * * * * *if(self.guild == GIL_BAU)<br> * * * * * *{ * <br> * * * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1);<br> * * * * * *};<br> * * * * * *// если НПС маг послушник<br> * * * * * *if(self.guild == GIL_NOV)<br> * * * * * *{ * <br> * * * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1);<br> * * * * * *};<br> * * * *};<br> * *};<br>};<br><br>Эта функция расположена в директории ..\AI\AI_Intern в одноименном файле.<br>------------------------------------------------------------<br><br>// ************************************************** *********<br>// Функция реплик НПС при обыскивании тел, когда нечего взять<br>// -----------------------------------------------------------<br>// Вызывается только экзешником<br>// ************************************************** *********<br><br>// -----------------------------------------------<br>// self - обыскивающий НПС<br>// -----------------------------------------------<br><br>func void PLAYER_PLUNDER_IS_EMPTY()<br>{<br> * *var int rnd;<br> * *rnd = Hlp_Random(100);<br> * *// с вероятностью 0.4<br> * *if(rnd <= 40)<br> * *{ * <br> * * * *// напечатать текст по цетру экрана "здесь ничего нет..."<br> * * * *Print(PRINT_NOTHINGTOGET);<br> * * * *// произносится SVM фраза "Здесь нечего унести ..."<br> * * * *B_Say_Overlay(self,self,"$NOTHINGTOGET" ); * <br> * *}<br> * *// с вероятностью 0.4<br> * *else if(rnd <= 80)<br> * *{ * <br> * * * *// напечатать текст по цетру экрана "Нечего унести..."<br> * * * *Print(PRINT_NOTHINGTOGET02);<br> * * * *// произносится SVM фраза "нечего унести ..."<br> * * * *B_Say_Overlay(self,self,"$NOTHINGTOGET02&quo t;); <br> * *}<br> * *// с вероятностью 0.2<br> * *else if(rnd <= 99)<br> * *{ * <br> * * * *// напечатать текст по цетру экрана "Нечего грабить..."<br> * * * *Print(PRINT_NOTHINGTOGET03);<br> * * * *// произносится SVM фраза "нечего украсть ..."<br> * * * *B_Say_Overlay(self,self,"$NOTHINGTOGET03&quo t;); <br> * *};<br>};<br><br>Эта функция расположена в директории ..\AI\AI_Intern в одноименном файле.<br>------------------------------------------------------------<br><br>//************************************************** ************<br>*****<br>// Функция обновления доспехов НПС<br>// -------------------------------------------------------------------<br>// Вызывается только экзешником (пока пуста)<br>// ************************************************** *****************<br><br>func void B_RefreshArmor()<br>{<br>};<br><br>Эта функция расположена в директории ..\AI\Human в одноименном файле.<br>------------------------------------------------------------<br><br>B_ функции монстров расположены в директории ..\AI\Monster\B_Monster<br><br>// ***********************************<br>// Функция задержки реакции монстров<br>// ***********************************<br><br>func void B_MM_DeSynchronize()<br>{<br> * *var int msec;<br> * *msec = Hlp_Random(1000);<br> * *// случайная задержка от 0 до 1 сек<br> * *AI_Waitms(self,msec);<br>};<br><br>... ещё файл<br><br>// *******************************************<br>// Выполнение Огоньком заданий<br>// *******************************************<br><br >// ----------------------------------------------------<br>// self - Огонек<br>// item - предмет<br>// ----------------------------------------------------<br><br>// Реакция Огонька на найденный предмет<br>func void B_GetWispDetectedItem()<br>{<br> * *// если предмет не существует<br> * *if(!Hlp_IsValidItem(item))<br> * *{<br> * * * *return;<br> * *};<br> * *// если расстояние между Огоньком и предметом > 5м<br> * *if(Npc_GetHeightToItem(self,item) > 500)<br> * *{<br> * * * *return;<br> * *};<br> * *var int randy;<br> * *randy = Hlp_Random(100);<br> * *// Огонек движется к предмету<br> * *AI_GotoItem(self,item);<br> * *// если расстояние между Огоньком и предметом < 1м и вероятность <= 0.01<br> * *if(Npc_GetDistToItem(self,item) < 1000) && (randy <= 1)<br> * *{<br> * * * *// проигрывается анимация выкапывания предмета<br> * * * *Wld_PlayEffect("spellFX_ItemAusbuddeln" ,item,item,0,0,0,FALSE );<br> * *};<br>};<br><br>// Поиск Огоньком предметов<br>//----------------------------------------------------------------<br>// Возвращаемое значение: что нашел Огонек (в принципе не нужно)<br>func int B_WispDetectedItem()<br>{ * <br> * *// если Огонек ничего не ищет<br> * *if(WispSearching == WispSearch_Follow)<br> * *{<br> * *}<br> * *else // иначе (режим поиска)<br> * *{<br> * * * *var int WispSearchFlags;<br> * * * *// флаг поиска<br> * * * *WispSearchFlags = 0;<br> * * * *// если Огонек обучен искать оружие ближнего радиуса поражения и <br> * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_NF] == TRUE)<br> * * * *// (режим поиска - искать всё или оружие ближнего радиуса поражения)<br> * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_NF)))<br> * * * *{<br> * * * * * *// установить соответствующий флаг<br> * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_NF;<br> * * * *};<br> * * * *// если Огонек обучен искать оружие дальнего радиуса поражения и <br> * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_FF] == TRUE)<br> * * * *// (режим поиска - искать всё или оружие дальнего радиуса поражения)<br> * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_FF)))<br> * * * *{<br> * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_FF ¦ ITEM_KAT_MUN;<br> * * * *};<br> * * * *// если Огонек обучен искать деньги, ключи, предметы обихода и <br> * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_NONE] == TRUE)<br> * * * *// (режим поиска - искать всё или указанные вещи)<br> * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_NONE)))<br> * * * *{<br> * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_NONE ¦ ITEM_KAT_KEYS ¦ ITEM_KAT_LIGHT ¦ ITEM_KAT_ARMOR;<br> * * * *};<br> * * * *// если Огонек обучен искать руны и свитки и <br> * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_RUNE] == TRUE)<br> * * * *// (режим поиска - искать всё или указанные вещи)<br> * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_RUNE)))<br> * * * *{<br> * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_RUNE ¦ ITEM_KAT_DOCS;<br> * * * *};<br> * * * *// если Огонек обучен искать кольца и амулеты и <br> * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_MAGIC] == TRUE)<br> * * * *// (режим поиска - искать всё или указанные вещи)<br> * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_MAGIC)))<br> * * * *{<br> * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_MAGIC;<br> * * * *};<br> * * * *// если Огонек обучен искать пропитание и <br> * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_FOOD] == TRUE)<br> * * * *// (режим поиска - искать всё или указанные вещи)<br> * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_FOOD)))<br> * * * *{<br> * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_FOOD;<br> * * * *};<br> * * * *// если Огонек обучен искать напитки и <br> * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_POTIONS] == TRUE)<br> * * * *// (режим поиска - искать всё или указанные вещи)<br> * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_POTIONS)))<br> * * * *{<br> * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_POTIONS;<br> * * * *};<br> * * * *// если Огонек способен что-то найти<br> * * * *if(WispSearchFlags != 0)<br> * * * *{<br> * * * * * *// если найден предмет с указанными флагами<br> * * * * * *if(Wld_DetectItem(self,WispSearchFlags))<br> * * * * * *{<br> * * * * * * * *// реакция Огонька на найденный предмет<br> * * * * * * * *B_GetWispDetectedItem();<br> * * * * * *};<br> * * * *};<br> * * * *return WispSearchFlags;<br> * *};<br> * *return 0;<br>};<br><br>// Выполнение Огоньком заданий<br>func int B_MM_WispDetect()<br>{<br> * *// если self (вызванный монстр) есть Огонек<br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Wisp_Detector))<br> * *{<br> * * * *// разрешить Огоньку воспринимать все объекты в зоне действия восприятия<br> * * * *Npc_PerceiveAll(self);<br> * * * *// если найден другой Огонек (other инициализирован Огоньком)<br> * * * *if(Wld_DetectNpc(self,Wisp_Detector,NOFUNC,-1)<br> * * * *{<br> * * * * * *// удалить Огонек<br> * * * * * *B_RemoveNpc(self);<br> * * * *};<br> * * * *// если расстояние между Огоньком и ГГ меньше 20м и установлен флаг близости<br> * * * *if(Npc_GetDistToNpc(self,hero) < 2000) && (self.aivar[AIV_TAPOSITION] == ISINPOS)<br> * * * *{<br> * * * * * *// сброс времени жизни монстра<br> * * * * * *self.aivar[AIV_SummonTime] = 0;<br> * * * * * *// выполнение поиска Огоньком<br> * * * * * *B_WispDetectedItem();<br> * * * * * *return LOOP_END;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// если расстояние между Огоньком и ГГ меньше 5м<br> * * * * * *if(Npc_GetDistToNpc(self,hero) < 500)<br> * * * * * *{<br> * * * * * * * *// установить флаг близости<br> * * * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * * * * * *}<br> * * * * * *else<br> * * * * * *{<br> * * * * * * * *// установить флаг удаленности<br> * * * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * * * * * *// очистка очереди AI состояний Огонька<br> * * * * * * * *Npc_ClearAIQueue(self);<br> * * * * * * * *// Огонек движется к ГГ<br> * * * * * * * *AI_GotoNpc(self,hero);<br> * * * * * *};<br> * * * * * *return LOOP_END;<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>
|
Re: Уроки скриптологии
C_ функции монстров расположены в директории ..\AI\Monsrer\C_Monster<br><br>// ************************************************** ******************<br>// Является ли монстр магом<br>// ************************************************** ******************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый монстр<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_NpcIsMonsterMage(var C_NPC slf)<br>{<br> * *// если монстр Маг скелетов или<br> * *if (slf.guild == GIL_SKELETON_MAGE)<br> * *¦¦ (slf.guild == GIL_FIREGOLEM) * * // Огненный голем<br> * *¦¦ (slf.guild == GIL_ICEGOLEM) * * *// или Ледяной голем<br> * *¦¦ (slf.guild == GIL_DRAGON) * * * *// или Дракон<br> * *{<br> * * * *return TRUE;<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// ************************************************** ******************************<br>*****<br>// Устраивает ли монстра добыча в виде жертвы (на кого охотяться монстры)<br>// ************************************************** ******************************<br>*****<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый монстр (охотник)<br>// oth - НПС добыча<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_PredatorFoundPrey(var C_NPC slf,var C_NPC oth)<br>{<br> * *// если охотник волк, но не кабан<br> * *if(slf.guild == GIL_WOLF) && (slf.aivar[AIV_MM_REAL_ID] != ID_Keiler)<br> * *{<br> * * * *// если добыча овца<br> * * * *if(oth.guild == GIL_SHEEP) * * *{ return TRUE; };<br> * * * *// если добыча крыса<br> * * * *if(oth.guild == GIL_GIANT_RAT) *{ return TRUE; };<br> * * * *// если добыча кротокрыс<br> * * * *if(oth.guild == GIL_MOLERAT) * *{ return TRUE; };<br> * * * *// если добыча падальщик, но не зубастик<br> * * * *if(oth.guild == GIL_SCAVENGER) && (oth.aivar[AIV_MM_REAL_ID] != ID_ORCBITER) * *{ return TRUE; };<br> * *};<br> * *// если охотник шныг<br> * *if(slf.guild == GIL_LURKER) * * * * <br> * *{<br> * * * *// если добыча гоблин<br> * * * *if (oth.guild == GIL_GOBBO) * * { return TRUE; };<br> * *};<br> * *// если охотник глорх<br> * *if(slf.guild == GIL_SNAPPER)<br> * *{<br> * * * *// если добыча человек<br> * * * *if(oth.guild < GIL_SEPERATOR_HUM) * { return TRUE; };<br> * * * *// если добыча гоблин<br> * * * *if(oth.guild == GIL_GOBBO) * * * * *{ return TRUE; };<br> * * * *// если добыча овца<br> * * * *if(oth.guild == GIL_SHEEP) * * * * *{ return TRUE; };<br> * * * *// если добыча крыса<br> * * * *if(oth.guild == GIL_GIANT_RAT) * * *{ return TRUE; };<br> * * * *// если добыча кротокрыс<br> * * * *if(oth.guild == GIL_MOLERAT) * * * *{ return TRUE; };<br> * * * *// если добыча падальщик, но не зубастик<br> * * * *if(oth.guild == GIL_SCAVENGER) && (oth.aivar[AIV_MM_REAL_ID] != ID_ORCBITER) * *{ return TRUE; };<br> * *};<br> * *// если охотник мракорис<br> * *if(slf.guild == GIL_SHADOWBEAST) * * * * * *<br> * *{<br> * * * *// если добыча человек<br> * * * *if(oth.guild < GIL_SEPERATOR_HUM) * { return TRUE; };<br> * * * *// если добыча орк<br> * * * *if(oth.guild > GIL_SEPERATOR_ORC) * { return TRUE; };<br> * * * *// если добыча овца<br> * * * *if(oth.guild == GIL_SHEEP) * * * * *{ return TRUE; };<br> * * * *// если добыча крыса<br> * * * *if(oth.guild == GIL_GIANT_RAT) * * *{ return TRUE; };<br> * * * *// если добыча кротокрыс<br> * * * *if(oth.guild == GIL_MOLERAT) * * * *{ return TRUE; };<br> * * * *// если добыча падальщик, но не зубастик<br> * * * *if(oth.guild == GIL_SCAVENGER) && (oth.aivar[AIV_MM_REAL_ID] != ID_ORCBITER) * *{ return TRUE; };<br> * *};<br> * *return FALSE;<br>};<br><br>... ещё файл<br><br>// ***********************************<br>// Пожирает ли монстр труп добычи<br>// ***********************************<br><br>// ================================================== ==================<br>// Аргументы:<br>// --------------------------------------------------------------------<br>// slf - проверяемый монстр (охотник)<br>// oth - НПС добыча (труп)<br>// --------------------------------------------------------------------<br>// Возвращаемое значение:<br>// TRUE - да, FALSE - нет.<br>// ================================================== ==================<br><br>func int C_WantToEat(var C_NPC slf,var C_NPC oth)<br>{<br> * *// если монстр член партии ГГ<br> * *if(slf.aivar[AIV_PARTYMEMBER] == TRUE)<br> * *{<br> * * * *return FALSE;<br> * *};<br> * *// если охотник падальщик<br> * *if(slf.guild == GIL_SCAVENGER)<br> * *{<br> * * * *// если труп человек или орк<br> * * * *if(oth.guild < GIL_SEPERATOR_HUM) * * * { * return TRUE; * *};<br> * * * *if(oth.guild > GIL_SEPERATOR_ORC) * * * { * return TRUE; * *};<br> * * * *// если труп овца или полевые хищники<br> * * * *if(oth.guild == GIL_SHEEP) * * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_GIANT_RAT) * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_MOLERAT) * * * * * *{ * return TRUE; * *};<br> * * * *// если труп гарпия<br> * * * *if(oth.guild == GIL_HARPY) * * * * * * *{ * return TRUE; * *};<br> * * * *// если труп волки<br> * * * *if(oth.guild == GIL_WOLF) * * * * * * * { * return TRUE; * *};<br> * * * *if(oth.guild == GIL_SUMMONED_WOLF) * * *{ * return TRUE; * *};<br> * * * *// если труп мракорис<br> * * * *if(oth.guild == GIL_SHADOWBEAST) * * * *{ * return TRUE; * *};<br> * * * *// если труп рептилий<br> * * * *if(oth.guild == GIL_GOBBO) * * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_WARAN) * * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_LURKER) * * * * * * { * return TRUE; * *};<br> * * * *if(oth.guild == GIL_SNAPPER) * * * * * *{ * return TRUE; * *};<br> * * * *// в принципе здесь все понятно и без комментариев<br> * * * *if(oth.guild == GIL_MEATBUG) * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_GIANT_BUG) * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_BLOODFLY) * * * * * { * return TRUE; * *};<br> * * * *if(oth.guild == GIL_MINECRAWLER) * * * *{ * return TRUE; * *};<br> * *};<br> * *// если охотник крыса<br> * *if(slf.guild == GIL_GIANT_RAT)<br> * *{<br> * * * *if(oth.guild < GIL_SEPERATOR_HUM) * * * { * return TRUE; * *};<br> * * * *if(oth.guild > GIL_SEPERATOR_ORC) * * * { * return TRUE; * *};<br> * * * *if(oth.guild == GIL_SHEEP) * * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_GIANT_RAT) * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_MOLERAT) * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_SCAVENGER) * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_HARPY) * * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_WOLF) * * * * * * * { * return TRUE; * *};<br> * * * *if(oth.guild == GIL_SUMMONED_WOLF) * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_SHADOWBEAST) * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_GOBBO) * * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_WARAN) * * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_LURKER) * * * * * * { * return TRUE; * *};<br> * * * *if(oth.guild == GIL_SNAPPER) * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_MEATBUG) * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_GIANT_BUG) * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_BLOODFLY) * * * * * { * return TRUE; * *};<br> * * * *if(oth.guild == GIL_MINECRAWLER) * * * *{ * return TRUE; * *};<br> * *};<br> * *// если охотник полевой жук<br> * *if(slf.guild == GIL_GIANT_BUG)<br> * *{<br> * * * *if(oth.guild == GIL_MEATBUG) * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_BLOODFLY) * * * * * { * return TRUE; * *};<br> * * * *if(oth.guild == GIL_MINECRAWLER) * * * *{ * return TRUE; * *};<br> * *};<br> * *// если охотник ящерица<br> * *if(slf.guild == GIL_WARAN)<br> * *{<br> * * * *if(oth.guild == GIL_SCAVENGER) * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_HARPY) * * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_GOBBO) * * * * * * *{ * return TRUE; * *};<br> * *};<br> * *// если охотник волк, но не кабан<br> * *if(slf.guild == GIL_WOLF) && (slf.aivar[AIV_MM_REAL_ID] != ID_Keiler)<br> * *{<br> * * * *if(oth.guild < GIL_SEPERATOR_HUM) * * * { * return TRUE; * *};<br> * * * *if(oth.guild == GIL_SHEEP) * * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_GIANT_RAT) * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_MOLERAT) * * * * * *{ * return TRUE; * *};<br> * *};<br> * *// если охотник вызванный волк<br> * *if(slf.guild == GIL_SUMMONED_WOLF)<br> * *{<br> * * * *if(oth.guild == GIL_SHEEP) * * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_GIANT_RAT) * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_MOLERAT) * * * * * *{ * return TRUE; * *};<br> * *};<br> * *// если охотник ползун<br> * *if(slf.guild == GIL_MINECRAWLER)<br> * *{<br> * * * *if(oth.guild < GIL_SEPERATOR_HUM) * * * { * return TRUE; * *};<br> * * * *if(oth.guild > GIL_SEPERATOR_ORC) * * * { * return TRUE; * *};<br> * * * *if(oth.guild == GIL_MEATBUG) * * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_GIANT_BUG) * * * * *{ * return TRUE; * *};<br> * * * *if(oth.guild == GIL_BLOODFLY) * * * * * { * return TRUE; * *};<br> * *};<br> * *// если охотник шныг<br> * *if(slf.guild == GIL_LURKER)<br> * *{<br> * * * *if (oth.guild < GIL_SEPERATOR_HUM) * * *{ * return TRUE; * *};<br> * * * *if (oth.guild > GIL_SEPERATOR_ORC) * * *{ * return TRUE; * *};<br> * * * *if (oth.guild == GIL_GOBBO) * * * * * * { * return TRUE; * *};<br> * *};<br> * *// если охотник зомби<br> * *if (slf.guild == GIL_ZOMBIE)<br> * *{<br> * * * *if (oth.guild < GIL_SEPERATOR_HUM) * * *{ * return TRUE; * *};<br> * * * *if (oth.guild > GIL_SEPERATOR_ORC) * * *{ * return TRUE; * *};<br> * *};<br> * *// если охотник глорх<br> * *if (slf.guild == GIL_SNAPPER)<br> * *{<br> * * * *if (oth.guild < GIL_SEPERATOR_HUM) * * *{ * return TRUE; * *};<br> * * * *if (oth.guild > GIL_SEPERATOR_ORC) * * *{ * return TRUE; * *};<br> * * * *if (oth.guild == GIL_SHEEP) * * * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_GIANT_RAT) * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_MOLERAT) * * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_SCAVENGER) * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_HARPY) * * * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_WOLF) * * * * * * *{ * return TRUE; * *};<br> * * * *if (oth.guild == GIL_SUMMONED_WOLF) * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_SHADOWBEAST) * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_GOBBO) * * * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_WARAN) * * * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_LURKER) * * * * * *{ * return TRUE; * *};<br> * *};<br> * *// если охотник мракорис<br> * *if (slf.guild == GIL_SHADOWBEAST)<br> * *{<br> * * * *if (oth.guild < GIL_SEPERATOR_HUM) * * *{ * return TRUE; * *};<br> * * * *if (oth.guild > GIL_SEPERATOR_ORC) * * *{ * return TRUE; * *};<br> * * * *if (oth.guild == GIL_SHEEP) * * * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_GIANT_RAT) * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_MOLERAT) * * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_SCAVENGER) * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_HARPY) * * * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_WOLF) * * * * * * *{ * return TRUE; * *};<br> * * * *if (oth.guild == GIL_SUMMONED_WOLF) * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_GOBBO) * * * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_WARAN) * * * * * * { * return TRUE; * *};<br> * * * *if (oth.guild == GIL_LURKER) * * * * * *{ * return TRUE; * *};<br> * * * *if (oth.guild == GIL_SNAPPER) * * * * * { * return TRUE; * *};<br> * *};<br> * *return FALSE;<br>};<br><br>
|
Re: Уроки скриптологии
19. Обработчики состояний функций распорядка дня для людей.<br><br>Все обработчики расположены в директории ..\AI\Human\TA_Human<br><br>// ******************************************<br>// Объявления Герольда<br>// ------------------------------------------<br>// self - герольд, hero - ГГ<br>// ******************************************<br><br>// Функция инициализации состояния<br>func void ZS_Announce_Herold()<br>{ * <br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// разрешить восприятие тихих звуков (шаги, звон падающего предмета)<br> * *Npc_PercDisable(self,PERC_ASSESSQUIETSOUND);<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// движение на свой вайпоинт<br> * *AI_GotoWP(self,self.wp);<br> * *// выравнивание на вайпоинте<br> * *AI_AlignToWP(self);<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Функция цикла состояния<br>func int ZS_Announce_Herold_loop()<br>{<br> * *// если время цикла > 70 сек и ГГ ни с кем не разговаривает<br> * *if(Npc_GetStateTime(self) >= 70) && (hero.aivar[AIV_INVINCIBLE] == FALSE)<br> * *{<br> * * * *// анимация перехода в состояние чтения<br> * * * *AI_PlayAni(self,"T_HGUARD_2_STAND");<br > * * * *// сброс флага<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *// зачитывание приказов<br> * * * *B_Announce_Herold();<br> * * * *// сброс времени цикла<br> * * * *Npc_SetStateTime(self, 0);<br> * *};<br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// анимация перехода в обычное состояние<br> * * * *AI_PlayAni (self,"T_STAND_2_HGUARD");<br> * * * *// установка флага<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *}; *<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Announce_Herold_end()<br>{<br>}; *<br><br>... ещё файл<br><br>// ***************************************<br>// Обработчик поведения бандита<br>// ***************************************<br><br>// Функция инициализации состояния<br>func void ZS_Bandit()<br>{ * <br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между бандитом и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Функция цикла состояния<br>func int ZS_Bandit_loop()<br>{<br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// если бандит не у костра и костер имеется (Примечание: "костер" это ближайший свободный фрипоинт с именем FP_CAMPFIRE_xx, в дальнейшем буду использовать только сокращенное описание)<br> * * * *if(!Npc_IsOnFP(self,"CAMPFIRE")) && (Wld_IsFPAvailable(self,"CAMPFIRE"))<br> * * * *{<br> * * * * * *// бандит идет к костру<br> * * * * * *AI_GotoFP(self,"CAMPFIRE");<br> * * * * * *// выравнивается<br> * * * * * *AI_AlignToFP(self);<br> * * * * * *// садится<br> * * * * * *AI_PlayAniBS(self,"T_STAND_2_SIT",BS_SI T);<br> * * * *}<br> * * * *// если бандит не на своем месте и место имеется (свободно)<br> * * * *else if(!Npc_IsOnFP(self,"STAND")) && (Wld_IsFPAvailable(self,"STAND"))<br> * * * *{<br> * * * * * *// бандит идет к месту<br> * * * * * *AI_GotoFP(self,"STAND");<br> * * * * * *// выравнивается<br> * * * * * *AI_AlignToFP(self);<br> * * * * * *// охраняет<br> * * * * * *AI_PlayAni(self,"T_STAND_2_HGUARD");<br > * * * *}<br> * * * *else // иначе<br> * * * *{<br> * * * * * *// выравнивается<br> * * * * * *AI_AlignToWP(self);<br> * * * * * *// охраняет<br> * * * * * *AI_PlayAni(self,"T_STAND_2_HGUARD");<br > * * * *};<br> * * * *// установка флага<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *}; * * *<br> * *// если прошло 5 сек и флаг установлен и бандит не сидит<br> * *if(Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS) && (!C_BodyStateContains(self,BS_SIT))<br> * *{<br> * * * *var int random;<br> * * * *random = Hlp_Random(3);<br> * * * *// с вероятностью 0.33<br> * * * *if(random == 0)<br> * * * *{<br> * * * * * *// анимация осмотра<br> * * * * * *AI_PlayAni(self,"T_HGUARD_LOOKAROUND"); <br> * * * *};<br> * * * *// сброс времени цикла<br> * * * *Npc_SetStateTime (self, 0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Bandit_end()<br>{<br> * *// если бандит сидит<br> * *if(C_BodyStateContains(self,BS_SIT))<br> * *{<br> * * * *// встает<br> * * * *AI_PlayAniBS(self,"T_SIT_2_STAND",BS_ST AND);<br> * *}<br> * *else // иначе<br> * *{<br> * * * *// просто стоит<br> * * * *AI_PlayAni(self,"T_HGUARD_2_STAND");<br > * *};<br>};<br><br>... ещё файл<br><br>// ************************************<br>// Обработчик ритуала в Круге солнца<br>// ************************************<br><br>// Функция инициализации состояния<br>func void ZS_Circle() * <br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить время реакции на восприятия 0.3 сек<br> * *Npc_SetPercTime(self,0.3);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// движение в Круг солнца<br> * *AI_GotoWP(self,self.wp);<br> * *// выравнивание<br> * *AI_AlignToWP(self);<br>};<br><br>// Функция цикла состояния<br>func int ZS_Circle_Loop ()<br>{<br> * *var int randy;<br> * *var int randyKDW;<br> * *var int randyKDW_Lightstar;<br> * *// если НПС черный маг<br> * *if(self.guild == GIL_DMT)<br> * *{<br> * * * *randy = Hlp_Random(3000);<br> * * * *// случайное время<br> * * * *if(Npc_GetStateTime(self) > randy)<br> * * * *{<br> * * * * * *// анимация "Дрожь земли"<br> * * * * * *Wld_PlayEffect("FX_EarthQuake",self,sel f,0,0,0,FALSE);<br> * * * * * *// сброс времени цикла<br> * * * * * *Npc_SetStateTime(self,0);<br> * * * * * *// анимация красного экрана<br> * * * * * *Wld_PlayEffect("spellFX_INCOVATION_RED" ,self,self,0,0,0,FALSE);<br> * * * * * *// упражнение в магии<br> * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC5"); * *<br> * * * *}; *<br> * *}<br> * *// если НПС маг воды<br> * *else if(self.guild == GIL_KDW)<br> * *{<br> * * * *randyKDW = Hlp_Random(2500);<br> * * * *randyKDW_Lightstar= Hlp_Random(2);<br> * * * *// случайное время *<br> * * * *if(Npc_GetStateTime(self) > randyKDW)<br> * * * *{<br> * * * * * *// выравнивание<br> * * * * * *AI_AlignToWP(self);<br> * * * * * *// сброс времени цикла<br> * * * * * *Npc_SetStateTime(self,0);<br> * * * * * *// анимация "Дрожь земли"<br> * * * * * *Wld_PlayEffect("FX_EarthQuake",self,sel f,0,0,0,FALSE );<br> * * * * * *// упражнение в магии<br> * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC5");<br > * * * * * *// далее какие-то эффекты, кто знает, что делают маги воды в Круге солнца, может написать<br> * * * * * *Wld_PlayEffect("spellFX_RingRitual2",It Mi_AmbossEffekt_Addon,ItM<br>i_AmbossEffekt_Addon, 0,0,0,FALSE);<br> * * * * * *if(randyKDW_Lightstar == 0)<br> * * * * * *{ <br> * * * * * * * *Wld_PlayEffect("spellFX_RingRitual1",It Mi_AmbossEffekt_Addon,ItM<br>i_AmbossEffekt_Addon, 0,0,0,FALSE);<br> * * * * * *}<br> * * * * * *else if(randyKDW_Lightstar == 1)<br> * * * * * *{<br> * * * * * * * *Wld_PlayEffect("spellFX_LIGHTSTAR_RingRitual ",ItMi_AmbossEffekt_<br>Addon,ItMi_AmbossEffe kt_Addon,0,0,0,FALSE);<br> * * * * * *};<br> * * * *};<br> * *}<br> * *// если квест по восстановлению Глаза Инноса не завершен<br> * *else if(MIS_RitualInnosEyeRepair != LOG_SUCCESS)<br> * *{<br> * * * *randy = Hlp_Random(1000);<br> * * * *// случайное время *<br> * * * *if(Npc_GetStateTime(self) > randy)<br> * * * *{<br> * * * * * *// сброс времени цикла<br> * * * * * *Npc_SetStateTime(self,0);<br> * * * * * *// анимация "Дрожь земли"<br> * * * * * *Wld_PlayEffect("FX_EarthQuake",self,sel f,0,0,0,FALSE);<br> * * * * * *// упражнение в магии<br> * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC5");<br > * * * * * *// если НПС Ксардас<br> * * * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Xardas))<br> * * * * * *{<br> * * * * * * * *// анимация фиолетового экрана<br> * * * * * * * *Wld_PlayEffect("spellFX_INCOVATION_VIOLET&qu ot;,self,self,0,0,0,FALSE<br>);<br> * * * * * *}<br> * * * * * *// если НПС Пирокар<br> * * * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Pyrokar))<br> * * * * * *{<br> * * * * * * * *// анимация красного экрана<br> * * * * * * * *Wld_PlayEffect("spellFX_INCOVATION_RED" ,self,self,0,0,0,FALSE);<br> * * * * * *}<br> * * * * * *else // иначе Ватрас<br> * * * * * *{<br> * * * * * * * *// анимация голубого экрана<br> * * * * * * * *Wld_PlayEffect("spellFX_INCOVATION_BLUE" ;,self,self,0,0,0,FALSE);<br> * * * * * *};<br> * * * *}; *<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Circle_End()<br>{<br>};<br><br>... ещё файл<br><br>// ***************************************<br>// Обработчик концерта InExtremo в аддоне<br>// ***************************************<br><br>// Функция инициализации состояния<br>func void ZS_Concert()<br>{ * <br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if (Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br> * *<br>// Функция цикла состояния<br>func int ZS_Concert_Loop ()<br>{<br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// если НПС "Yellow Pfeiffer"<br> * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1394_Addon_InExtremo_YellowP feiffer))<br> * * * *{<br> * * * * * *// использует Желтую волынку<br> * * * * * *AI_UseItemToState(self,ItMi_IEDudelGelb,1);<br> * * * *}<br> * * * *// если НПС "Dr. Pymonte"<br> * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1390_Addon_InExtremo_DrPymon te))<br> * * * *{<br> * * * * * *// использует Арфу<br> * * * * * *AI_UseItemToState(self,ItMi_IEHarfe,1);<br> * * * *}<br> * * * *// если НПС "The Flail"<br> * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1391_Addon_InExtremo_TheFlai l))<br> * * * *{<br> * * * * * *// использует Drum<br> * * * * * *AI_UseItemToState(self,ItMi_iedrum,1);<br> * * * *}<br> * * * *// если НПС "Thomas the forger"<br> * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1392_Addon_InExtremo_ThomasT heForger))<br> * * * *{<br> * * * * * *// использует Виолончель<br> * * * * * *AI_UseItemToState(self,ItMi_IECello,1);<br> * * * *}<br> * * * *// если НПС "Unicorn"<br> * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1393_Addon_InExtremo_Unicorn ))<br> * * * *{<br> * * * * * *// использует Лютню<br> * * * * * *AI_UseItemToState(self,ItMi_IELaute,1);<br> * * * *}<br> * * * *// если НПС "Lutter"<br> * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1395_Addon_InExtremo_Lutter) )<br> * * * *{<br> * * * * * *// использует Drumscheit<br> * * * * * *AI_UseItemToState(self,ItMi_IEDrumscheit,1);<br> * * * *}<br> * * * *// если НПС "Flex"<br> * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1396_Addon_InExtremo_Flex))< br> * * * *{<br> * * * * * *// использует Голубую волынку<br> * * * * * *AI_UseItemToState(self,ItMi_IEDudelBlau,1);<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * * // Танцы пиратов?<br> * * * *};<br> * * * *// установка флага<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Concert_End()<br>{<br> * *// шестерка музыкантов, кроме Flexа, убирают свои инструменты <br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1394_Addon_InExtremo_YellowP feiffer))<br> * *{<br> * * * *AI_UseItemToState(self,ItMi_IEDudelGelb,-1);<br> * *}<br> * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1390_Addon_InExtremo_DrPymon te))<br> * *{<br> * * * *AI_UseItemToState(self,ItMi_IEHarfe,-1);<br> * *}<br> * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1391_Addon_InExtremo_TheFlai l))<br> * *{<br> * * * *AI_UseItemToState(self,ItMi_iedrum,-1);<br> * *}<br> * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1392_Addon_InExtremo_ThomasT heForger))<br> * *{<br> * * * *AI_UseItemToState(self,ItMi_IECello,-1);<br> * *}<br> * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1393_Addon_InExtremo_Unicorn ))<br> * *{<br> * * * *AI_UseItemToState(self,ItMi_IELaute,-1);<br> * *}<br> * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1395_Addon_InExtremo_Lutter) )<br> * *{<br> * * * *AI_UseItemToState(self,ItMi_IEDrumscheit,-1);<br> * *};<br>};<br><br>
|
Re: Уроки скриптологии
// ***************************************<br>// Обработчик приготовления пищи в котле<br>// ***************************************<br><br>// Функция инициализации состояния<br>func void ZS_Cook_Cauldron()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// если НПС не имеет ложки<br> * *if(Npc_HasItems(self,ItMi_Scoop) == 0)<br> * *{<br> * * * *// создать в инвентаре НПС ложку<br> * * * *CreateInvItem(self,ItMi_Scoop); * * * * * * <br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Cook_Cauldron_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и котел имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"CAULDRON"))<br > * *{<br> * * * *// мешать ложкой в котле<br> * * * *AI_UseMob(self,"CAULDRON",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Cook_Cauldron_End()<br>{<br> * *// прекратить использовать котел<br> * *AI_UseMob(self,"CAULDRON",-1);<br>};<br><br>... ещё файл<br><br>// *******************************************<br>// Обработчик приготовления пищи на сковороде<br>// *******************************************<br><br >// Функция инициализации состояния<br>func void ZS_Cook_Pan()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// если НПС не имеет Сырого мяса<br> * *if(Npc_HasItems(self,ItFoMuttonRaw) == 0)<br> * *{<br> * * * *// создать в инвентаре НПС Сырое мясо<br> * * * *CreateInvItem(self,ItFoMuttonRaw); * * * * * * *<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Cook_Pan_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и сковорода имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"PAN"))<br> * *{<br> * * * *// жарить мясо<br> * * * *AI_UseMob(self,"PAN",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Cook_Pan_End()<br>{<br> * *// прекратить использовать котел<br> * *AI_UseMob(self,"PAN",-1);<br> * *// съесть жареное мясо<br> * *AI_UseItem(self,ItFoMutton);<br>};<br><br>... ещё файл<br><br>// *************************************<br>// Обработчик приготовления пищи в печи<br>// *************************************<br><br>// Функция инициализации состояния<br>func void ZS_Cook_Stove()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// если НПС не имеет Сырого мяса<br> * *if(Npc_HasItems(self,ItFoMuttonRaw) == 0)<br> * *{<br> * * * *// создать в инвентаре НПС Сырое мясо<br> * * * *CreateInvItem(self,ItFoMuttonRaw); * * * * * * *<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Cook_Stove_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и печь имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"STOVE"))<br> * *{<br> * * * *// жарить мясо<br> * * * *AI_UseMob(self,"STOVE",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Cook_Stove_End()<br>{<br> * *// прекратить использовать печь<br> * *AI_UseMob(self,"STOVE",-1);<br> * *// если НПС имеет больше 1 куска жареного мяса<br> * *if(Npc_HasItems(self,ItFoMutton) >=1 )<br> * *{<br> * * * *// удалить из инветаря НПС 1 кусок жареного мяса<br> * * * *Npc_RemoveInvItems(self,ItFoMutton,1);<br> * *}; *<br>};<br><br>... ещё файл<br><br>// ***********************<br>// Обработчик танцев НПС<br>// ***********************<br><br>// Функция инициализации состояния<br>func void ZS_Dance()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); *<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * * * *// выравнивание<br> * * * *AI_AlignToWP(self);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Dance_Loop()<br>{<br> * *var int danceStyle;<br> * *danceStyle = Hlp_Random(9);<br> * *// случайная анимация фаз танца<br> * *if(danceStyle == 0)<br> * *{<br> * * * *AI_PlayAni(self,"T_DANCE_01");<br> * *};<br> * *if(danceStyle == 1)<br> * *{<br> * * * *AI_PlayAni(self,"T_DANCE_02");<br> * *};<br> * *if(danceStyle == 2)<br> * *{<br> * * * *AI_PlayAni(self,"T_DANCE_03");<br> * *};<br> * *if(danceStyle == 3)<br> * *{<br> * * * *AI_PlayAni(self,"T_DANCE_04");<br> * *};<br> * *if(danceStyle == 4)<br> * *{<br> * * * *AI_PlayAni(self,"T_DANCE_05");<br> * *};<br> * *if(danceStyle == 5)<br> * *{<br> * * * *AI_PlayAni(self,"T_DANCE_06");<br> * *};<br> * *if(danceStyle == 6)<br> * *{<br> * * * *AI_PlayAni(self,"T_DANCE_07");<br> * *};<br> * *if(danceStyle == 7)<br> * *{<br> * * * *AI_PlayAni(self,"T_DANCE_08");<br> * *};<br> * *if(danceStyle == 8 )<br> * *{<br> * * * *AI_PlayAni(self,"T_DANCE_09");<br> * *};<br> * *// движение на свой вайпоинт<br> * *AI_GotoWP(self,self.wp);<br> * *// выравнивание<br> * *AI_AlignToWP(self);<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Dance_End()<br>{<br> * *// танцор останавливается<br> * *AI_StandUp(self);<br>};<br><br>... ещё файл<br><br>// **************************************<br>// Обработчик убегания НПС на свою точку<br>// **************************************<br><br>// Функция инициализации состояния<br>func void ZS_FleeToWp()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// если НПС Корнелиус<br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Cornelius))<br> * *{<br> * * * *// закрыть восприятие входа в помещение<br> * * * *Npc_PercDisable(self,PERC_ASSESSENTERROOM);<br> * *};<br> * *// установить режим передвижения бегом<br> * *AI_SetWalkmode(self,NPC_RUN);<br> * *// включить модель убегающего человека<br> * *Mdl_ApplyOverlayMds(self,"HUMANS_FLEE.MDS&qu ot;);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP (self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// выравнивание<br> * *AI_AlignToWP(self);<br> * *// анимация состояния охраны<br> * *AI_PlayAni(self,"T_STAND_2_HGUARD");<br >};<br><br>// Функция цикла состояния<br>func int ZS_FleeToWp_Loop()<br>{ * <br> * *// если время в состоянии > 5 сек<br> * *if(Npc_GetStateTime(self) > 5)<br> * *{<br> * * * *var int random;<br> * * * *random = Hlp_Random(2);<br> * * * *// с вероятностью 0.5<br> * * * *if(random == 0)<br> * * * *{<br> * * * * * *// осмотреть окресности<br> * * * * * * AI_PlayAni(self,"T_HGUARD_LOOKAROUND");< br> * * * *};<br> * * * *// сброс времени состояния<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br> * *<br>// Функция завершения состояния<br>func int ZS_FleeToWp_End()<br>{ * <br>};<br><br>
|
Re: Уроки скриптологии
// *********************************<br>// Обработчик следования НПС за ГГ<br>// *********************************<br><br>// Функция локального восприятия НПС на ГГ<br>func void B_AssessFollowPlayer()<br>{<br> * *// если НПС Диего в Минентале<br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(DiegoOW))<br> * *{ * <br> * * * *// расстояние между НПС и ГГ < дистанции следования и флаг сброшен (НПС движется)<br> * * * *if(Npc_GetDistToNpc(self,hero) < self.aivar[AIV_FollowDist]) && (self.aivar[AIV_TAPOSITION] == FALSE)<br> * * * *{<br> * * * * * *// очистить очередь AI состояний НПС<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// НПС встает (ждет действий ГГ)<br> * * * * * *AI_StandUp(self);<br> * * * * * *// установить флаг (НПС остановился)<br> * * * * * *self.aivar[AIV_TAPOSITION] = TRUE;<br> * * * *}<br> * * * *// если Диего слишком далеко и флаг сброшен<br> * * * *else if(C_DiegoTooFar(0)) && (self.aivar[AIV_TAPOSITION] == FALSE)<br> * * * *{<br> * * * * * *// очистить очередь AI состояний Диего<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// Диего встает (ждет действий ГГ)<br> * * * * * *AI_StandUp(self);<br> * * * * * *// установить флаг<br> * * * * * *self.aivar[AIV_TAPOSITION] = TRUE;<br> * * * * * *// если расстояние между Диего и ГГ > дистанции начала разговора<br> * * * * * *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG)<br> * * * * * *{<br> * * * * * * * *// Диего говорит ГГ (SVM фраза) "Подожди!" (Примечание: правильней other заменить на hero)<br> * * * * * * * *B_Say(self,other,"$SC_HEYWAITASECOND"); <br> * * * * * *};<br> * * * *}<br> * * * *else // иначе<br> * * * *{ * <br> * * * * * *// обычная реакция НПС на ГГ<br> * * * * * *B_AssessPlayer();<br> * * * *};<br> * * * *return;<br> * *};<br> * *// расстояние между НПС и ГГ < дистанции следования и флаг сброшен<br> * *if(Npc_GetDistToNpc(self,hero) < self.aivar[AIV_FollowDist]) && (self.aivar[AIV_TAPOSITION] == FALSE)<br> * *{<br> * * * *// очистить очередь AI состояний НПС<br> * * * *Npc_ClearAIQueue(self);<br> * * * *// НПС встает (ждет действий ГГ)<br> * * * *AI_StandUp(self);<br> * * * *// установить флаг<br> * * * *self.aivar[AIV_TAPOSITION] = TRUE;<br> * *}<br> * *else<br> * *{ * <br> * * * *// обычная реакция НПС на ГГ<br> * * * *B_AssessPlayer();<br> * *};<br>};<br><br>// Функция локального восприятия НПС на звук сражения<br>func void B_AssessFollowFightSound()<br>{<br> * *// если other (нападающий) есть ГГ или victim (жертва) есть ГГ или<br> * *if(Npc_IsPlayer(other)) ¦¦ (Npc_IsPlayer(victim))<br> * *¦¦ (other.aivar[AIV_PARTYMEMBER] == TRUE) * * * * * // other - член партии ГГ<br> * *¦¦ (victim.aivar[AIV_PARTYMEMBER] == TRUE) * * * * *// или victim - член партии ГГ<br> * *{<br> * * * *// обычная реакция НПС на звук сражения<br> * * * *B_AssessFightSound();<br> * *};<br>};<br><br>// Данная функция не используется и может быть удалена.<br>func void B_MoveFollowNpc()<br>{<br>};<br><br>// Функция инициализации состояния<br>func void ZS_Follow_Player()<br>{<br> * *// разрешить НПС все чувства<br> * *self.senses = SENSE_SEE|SENSE_HEAR|SENSE_SMELL;<br> * *// установить дальность чувств 20 метров<br> * *self.senses_range = 2000; * * * <br> * *// установить время реакции на восприятия 0.3 сек<br> * *Npc_SetPercTime(self,0.3);<br> * *// разрешить минимальный набор восприятий<br> * *Perception_Set_Minimal();<br> * *// установить локальное восприятие НПС на ГГ<br> * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessFol lowPlayer);<br> * *// разрешить восприятие врага<br> * *Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnem y);<br> * *// разрешить восприятие разговора<br> * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;<br> * *// разрешить восприятие перемещения МОВа<br> * *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);<br> * *// установить локальное восприятие звуков сражения<br> * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sFollowFightSound);<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// НПС встает<br> * *AI_StandUp(self);<br> * *// установить режим передвижения бегом<br> * *AI_SetWalkmode(self,NPC_RUN);<br> * *// если дистанция между НПС не задана<br> * *if(self.aivar[AIV_FollowDist] == 0)<br> * *{<br> * * * *// задать дистанцию 5м<br> * * * *self.aivar[AIV_FollowDist] = 500;<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Follow_Player_Loop()<br>{<br> * *// расстояние между НПС и ГГ > дистанции следования<br> * *if(Npc_GetDistToNpc(self,hero) > self.aivar[AIV_FollowDist])<br> * *{<br> * * * *// если НПС Диего в Минентале<br> * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(DiegoOW))<br> * * * *{<br> * * * * * *// если Диего слишком далеко<br> * * * * * *if(C_DiegoTooFar(0))<br> * * * * * *{<br> * * * * * * * *// если прошло > 1 сек<br> * * * * * * * *if(Npc_GetStateTime(self) > 1)<br> * * * * * * * *{<br> * * * * * * * * * *// Диего поворачивается к ГГ<br> * * * * * * * * * *B_TurnToNpc(self,hero);<br> * * * * * * * * * *// сброс времени цикла<br> * * * * * * * * * *Npc_SetStateTime(self,0);<br> * * * * * * * *};<br> * * * * * * * *return LOOP_CONTINUE;<br> * * * * * *};<br> * * * *};<br> * * * *// если НПС не плывет<br> * * * *if(!C_BodyStateContains(self,BS_SWIM))<br> * * * *{ * <br> * * * * * *// установить режим передвижения бегом<br> * * * * * *AI_SetWalkmode(self,NPC_RUN);<br> * * * *};<br> * * * *// НПС движется к ГГ<br> * * * *AI_GotoNpc(self,hero);<br> * * * *// сброс флага (НПС в движении)<br> * * * *self.aivar[AIV_TAPOSITION] = FALSE;<br> * *}<br> * *else // расстояние < дистанции следования<br> * *{<br> * * * *// если прошло > 1 сек<br> * * * *if(Npc_GetStateTime(self) > 1)<br> * * * *{<br> * * * * * *// НПС поворачивается к ГГ<br> * * * * * *B_TurnToNpc(self,hero);<br> * * * * * *// сброс времени цикла<br> * * * * * *Npc_SetStateTime(self,0);<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Follow_Player_End()<br>{<br>};<br><br>... ещё файл<br><br>// **********************************<br>// Обработчик поведения призраков<br>// **********************************<br><br>// Функция инициализации состояния<br>func void ZS_Ghost()<br>{<br> * *var C_NPC Quarho;<br> * *// получить ссылку на Куарходрона<br> * *Quarho = Hlp_GetNpc(NONE_ADDON_111_Quarhodron);<br> * *// если НПС Куарходрон<br> * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Quarho))<br> * *{<br> * * * *// если информация о "Камерах Аданоса" не известна<br> * * * *if(Ghost_SCKnowsHow2GetInAdanosTempel == FALSE)<br> * * * *{ * <br> * * * * * *// разрешить восприятие разговора<br> * * * * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;<br> * * * *}; *<br> * *}<br> * *else<br> * *{<br> * * * *// разрешить восприятие разговора<br> * * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;<br> * *}; *<br> * *// разрешить восприятие повреждения<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить время реакции на восприятия 0.1 сек<br> * *Npc_SetPercTime(self,0.1);<br> * *// НПС встает<br> * *AI_StandUp(self); * * * * * * * <br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// движение на свой вайпоинт<br> * *AI_GotoWP(self, self.wp);<br> * *// выравнивание<br> * *AI_AlignToWP(self);<br>};<br><br>// Функция цикла состояния<br>func int ZS_Ghost_Loop()<br>{<br> * *// если прошло >= 5 сек<br> * *if(Npc_GetStateTime(self) >= 5)<br> * *{<br> * * * *// если расстояние между НПС и ГГ > дистанции начала диалога<br> * * * *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG)<br> * * * *{<br> * * * * * *// выравнивание<br> * * * * * *AI_AlignToWP(self);<br> * * * * * *// сброс времени состояния<br> * * * * * *Npc_SetStateTime(self,0);<br> * * * *};<br> * * * *// удалить призрака<br> * * * *B_RemoveGhost();<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Ghost_End()<br>{<br>};<br><br>// ******************************<br>// Обработчик поведения Радемеса<br>// ******************************<br><br>// Функция инициализации состояния<br>func void ZS_GhostWusel()<br>{<br> * *// разрешить восприятие разговора<br> * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;<br> * *// разрешить восприятие повреждения<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// НПС встает<br> * *AI_StandUp(self); * <br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.WP);<br> * *};<br> * *// движение на свободный фрипоинт<br> * *AI_GotoFP(self,"FP_ROAM");<br>};<br><br >// Функция цикла состояния (Радемес бродит по фрипоинтам)<br>func int ZS_GhostWusel_Loop()<br>{<br> * *// если прошло >= 3 сек<br> * *if(Npc_GetStateTime(self) >= 3)<br> * *{<br> * * * *// если Радемес находится на фрипоинте<br> * * * *if(Npc_IsOnFP(self,"FP_ROAM"))<br> * * * *{<br> * * * * * *// если есть свободный следующий фрипоинт<br> * * * * * *if(Wld_IsNextFPAvailable(self,"FP_ROAM" ))<br> * * * * * *{<br> * * * * * * * *// очистка очереди AI ссостояний НПС<br> * * * * * * * *Npc_ClearAIQueue(self);<br> * * * * * * * *// переход на следующий фрипоинт<br> * * * * * * * *AI_GotoNextFP(self,"FP_ROAM");<br> * * * * * *};<br> * * * *}<br> * * * *else // не на фрипоинте<br> * * * *{<br> * * * * * *// если НПС не передвигается<br> * * * * * *if(!C_BodyStateContains(self,BS_WALK)) && (!C_BodyStateContains(self,BS_RUN))<br> * * * * * *{<br> * * * * * * * *// перейти на фрипоинт<br> * * * * * * * *AI_GotoFP(self,"FP_ROAM");<br> * * * * * *};<br> * * * *};<br> * * * *// сброс времени состояния<br> * * * *Npc_SetStateTime(self,0);<br> * *}; *<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_GhostWusel_End()<br>{<br>};<br><br>
|
Re: Уроки скриптологии
// **********************************<br>// Охрана Святого молота Гарвигом<br>// **********************************<br><br>// Функция инициализации состояния<br>func void ZS_Guard_Hammer()<br>{ * <br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Функция цикла состояния<br>func int ZS_Guard_Hammer_loop()<br>{<br> * *// если НПС находится на фрипоинте охраны<br> * *if(Npc_IsOnFP(self,"STAND"))<br> * *{ * <br> * * * *// выравнивание<br> * * * *AI_AlignToFP(self);<br> * * * *// если НПС шел на фрипоинт<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *}<br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"STAND"))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"STAND");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выровняться<br> * * * *AI_AlignToFP(self);<br> * * * *// установить флаг перемещения<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;<br> * *}<br> * *else // фрипоинт занят<br> * *{<br> * * * *// выровняться на вайпоинте<br> * * * *AI_AlignToWP(self);<br> * * * *// если НПС шел в точку<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *}; <br> * *};<br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// анимация перехода в режим охраны<br> * * * *AI_PlayAni(self,"T_STAND_2_HGUARD");<br > * * * *// установить флаг охраны<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *}; *<br> * *// если НПС имеет Святой молот и расстояние до места хранения молота < 5м<br> * *if(Npc_HasItems(self,Holy_Hammer_MIS) == 1) && (Npc_GetDistToWP(self,"NW_MONASTERY_SANCTUM_0 1") <= 500)<br> * *{<br> * * * *// изъять из инвентаря НПС Святой молот<br> * * * *Npc_RemoveInvItems(self,Holy_Hammer_MIS,1);<br> * * * *// положить молот в точку хранения<br> * * * *Wld_InsertItem(Holy_Hammer_MIS,"FP_HAMMER&qu ot;); <br> * *};<br> * *// если прошло > 5 сек и НПС находится в режиме охраны<br> * *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))<br> * *{<br> * * * *var int random;<br> * * * *random = Hlp_Random(10);<br> * * * *// с вероятностью 0.1<br> * * * *if(random == 0)<br> * * * *{<br> * * * * * *// осмотреть окрестности<br> * * * * * *AI_PlayAni(self,"T_HGUARD_LOOKAROUND"); <br> * * * *};<br> * * * *// сброс времени цикла<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Guard_Hammer_end()<br>{<br> * *// анимация перехода из состояния охраны в стоячее<br> * *AI_PlayAni(self,"T_HGUARD_2_STAND");<br >}; *<br><br>... ещё файл<br><br>// ************************<br>// Охрана прохода НПС<br>// ************************<br><br>// Функция инициализации состояния<br>func void ZS_Guard_Passage()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll (self);<br> * *// установить время реакции на восприятия 0.1 сек<br> * *Npc_SetPercTime(self,0.1);<br> * *// НПС встает<br> * *AI_StandUp(self); * * * * * * * <br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// движение на свой вайпоинт<br> * *AI_GotoWP(self,self.wp);<br> * *// если расстояние между НПС и ГГ > дистанции диалога<br> * *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG)<br> * *{<br> * * * *// выровняться<br> * * * *AI_AlignToWP(self);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Guard_Passage_Loop()<br>{<br> * *// если прошло >= 3 сек<br> * *if (Npc_GetStateTime(self) >= 3)<br> * *{<br> * * * *// если расстояние между НПС и ГГ > дистанции диалога<br> * * * *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG)<br> * * * *{<br> * * * * * *// выровняться<br> * * * * * *AI_AlignToWP(self);<br> * * * * * *// сброс времени цикла<br> * * * * * *Npc_SetStateTime(self,0);<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Guard_Passage_End ()<br>{<br>};<br><br>... ещё файл<br><br>// *********************************<br>// Обработчик следования ГГ за НПС<br>// *********************************<br><br>// Функция локального восприятия НПС на ГГ<br>func void B_AssessGuidePlayer()<br>{<br> * *// если расстояние между НПС и ГГ > 8м<br> * *if(Npc_GetDistToNpc(self,hero) > 800)<br> * *{<br> * * * *// если расстояние от НПС до его вайпоинта < расстояния от ГГ до этого же вайпоинта<br> * * * *if(Npc_GetDistToWP(self,self.wp) < Npc_GetDistToWP(hero,self.wp))<br> * * * *{<br> * * * * * *// очистить очередь AI состояний НПС<br> * * * * * *Npc_ClearAIQueue(self);<br> * * * * * *// НПС встает<br> * * * * * *AI_StandUp(self);<br> * * * * * *// НПС поворачивается к ГГ<br> * * * * * *B_TurnToNpc(self,hero);<br> * * * *};<br> * * * *// если расстояние между НПС и ГГ > 12м и враги у НПС есть и отношения между НПС и ГГ враждебные<br> * * * *if(Npc_GetDistToNpc(self,hero) > 1200) && (self.aivar[AIV_EnemyOverride] == TRUE) && (Npc_GetAttitude(self,hero) == ATT_HOSTILE)<br> * * * *{<br> * * * * * *// сброс флага врагов (врагов и НПС нет)<br> * * * * * *self.aivar[AIV_EnemyOverride] = FALSE;<br> * * * *};<br> * *}<br> * *else<br> * *{<br> * * * *// обычная реакция НПС на ГГ<br> * * * *B_AssessPlayer();<br> * *};<br>};<br><br>// Функция локального восприятия НПС на звук сражения<br>func void B_AssessGuideFightSound()<br>{<br> * *// если other (нападающий) есть ГГ или victim (жертва) есть ГГ<br> * *if(Npc_IsPlayer(other)) ¦¦ (Npc_IsPlayer(victim))<br> * *{<br> * * * *// обычная реакция НПС на звук сражения<br> * * * *B_AssessFightSound();<br> * *};<br>};<br><br>// Функция инициализации состояния<br>func void ZS_Guide_Player()<br>{<br> * *// разрешить минимальный набор восприятий<br> * *Perception_Set_Minimal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll (self);<br> * *// разрешить НПС все чувства<br> * *self.senses = SENSE_SEE ¦ SENSE_HEAR ¦ SENSE_SMELL;<br> * *// установить дальность чувств 20 метров<br> * *self.senses_range = 2000;<br> * *// установить время реакции НПС на восприятия 1 сек<br> * *Npc_SetPercTime(self,1);<br> * *// установить локальное восприятие НПС на ГГ<br> * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessGui dePlayer);<br> * *// разрешить восприятие врага<br> * *Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnem y);<br> * *// разрешить восприятие разговора<br> * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;<br> * *// разрешить восприятие перемещения МОВа<br> * *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);<br> * *// установить локальное восприятие звуков сражения<br> * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sGuideFightSound);<br>};<br><br>// Функция цикла состояния<br>func int ZS_Guide_Player_Loop()<br>{ * <br> * *// если расстояние между НПС и ГГ > 8м и расстояние от НПС до его вайпоинта < расстояния от ГГ до этого же вайпоинта<br> * *if(Npc_GetDistToNpc(self,hero) > 800) && (Npc_GetDistToWP(self,self.wp) < Npc_GetDistToWP(hero,self.wp))<br> * *{<br> * * * *// локальная реакция НПС на ГГ<br> * * * *B_AssessGuidePlayer();<br> * *}<br> * *// если расстояние между НПС и его вайпоинтом > 3м<br> * *else if(Npc_GetDistToWP(self,self.wp) > 300)<br> * *{<br> * * * *// если НПС не плывет<br> * * * *if(!C_BodyStateContains(self,BS_SWIM))<br> * * * *{<br> * * * * * *// установить режим передвижения бегом<br> * * * * * *AI_SetWalkmode(self,NPC_RUN);<br> * * * *};<br> * * * *// движение НПС на вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *}<br> * *else<br> * *{<br> * * * *// НПС поворачивается к ГГ<br> * * * *B_TurnToNpc(self,hero);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br> * *<br>// Функция завершения состояния<br>func int ZS_Guide_Player_End()<br>{ * <br>};<br><br>... ещё файл<br><br>// *****************************<br>// НПС справляет малую нужду<br>// *****************************<br><br>// Функция инициализации состояния<br>func void ZS_Pee()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Функция цикла состояния<br>func int ZS_Pee_loop()<br>{<br> * *// если НПС на нужном фрипоинте<br> * *if(Npc_IsOnFP(self,"PEE"))<br> * *{ <br> * * * *// выравнивание<br> * * * *AI_AlignToFP(self);<br> * * * *// если НПС шел на фрипоинт<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *} <br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"PEE"))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"PEE");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выровняться<br> * * * *AI_AlignToFP(self);<br> * * * *// установить флаг перемещения<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;<br> * *}<br> * *else // фрипоинт занят<br> * *{<br> * * * *// выровняться на вайпоинте<br> * * * *AI_AlignToWP(self); <br> * * * *// если НПС шел в точку<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK )<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *}; *<br> * *}; <br> * *// если флаг сброшен и НПС на нужном фрипоинте<br> * *if((self.aivar[AIV_TAPOSITION] == NOTINPOS) && (Npc_IsOnFP(self,"PEE")))<br> * *{<br> * * * *// выровняться<br> * * * *AI_AlignToFP(self);<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// анимация мочеиспускания<br> * * * *AI_PlayAni(self,"T_STAND_2_PEE");<br> * * * *// установить флаг выполнения нужной функции<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Pee_end()<br>{<br> * *// прекратить мочеиспускание<br> * *AI_PlayAni(self,"T_PEE_2_STAND");<br>}; <br><br><br>
|
Re: Уроки скриптологии
// ************************************************** *******<br>// НПС бродит по PICK фрипоинтам (что-то ищет или собирает)<br>// ************************************************** *******<br><br>// Функция инициализации состояния<br>func void ZS_Pick_FP()<br>{ * <br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Pick_FP_Loop()<br>{<br> * *// если время состояния >= 7сек и с вероятностью 0.5<br> * *if((Npc_GetStateTime(self) >= 7) && (Hlp_Random(2))) *<br> * *{<br> * * * *// если НПС на фрипоинте и есть еще фрипоинт<br> * * * *if((Npc_IsOnFP(self,"PICK")) && (Wld_IsFPAvailable(self,"PICK")))<br> * * * *{<br> * * * * * *// НПС идет на следующий фрипоинт<br> * * * * * *AI_GotoNextFP(self,"PICK");<br> * * * * * *// анимация поиска<br> * * * * * *AI_PlayAni(self,"T_PLUNDER");<br> * * * * * *// сброс времени цикла<br> * * * * * *Npc_SetStateTime(self,0);<br> * * * *}<br> * * * *// если НПС на фрипоинте<br> * * * *else if(Npc_IsOnFP(self,"PICK"))<br> * * * *{<br> * * * * * *// анимация поиска<br> * * * * * *AI_PlayAni(self,"T_PLUNDER");<br> * * * * * *// сброс времени цикла<br> * * * * * *Npc_SetStateTime(self,0);<br> * * * *};<br> * * * *// установить режим передвижения шагом<br> * * * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *}<br> * *// если время состояния >= 7сек<br> * *else if(Npc_GetStateTime(self) >= 7)<br> * *{<br> * * * *// если НПС на фрипоинте<br> * * * *if(Npc_IsOnFP(self,"PICK"))<br> * * * *{ * * * <br> * * * * * *// анимация поиска<br> * * * * * *AI_PlayAni(self,"T_PLUNDER"); * <br> * * * *};<br> * * * *// установить режим передвижения шагом<br> * * * *AI_SetWalkmode (self,NPC_WALK); * * <br> * *};<br> * *// если НПС не на фрипоинте и есть еще фрипоинт<br> * *if((!Npc_IsOnFP(self,"PICK")) && (Wld_IsFPAvailable(self,"PICK")))<br> * *{<br> * * * *// НПС идет на фрипоинт<br> * * * *AI_GotoFP(self,"PICK");<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Pick_FP_End()<br>{<br>};<br><br>... ещё файл<br><br>// *********************<br>// НПС добывает руду<br>// *********************<br><br>// Функция инициализации состояния<br>func void ZS_Pick_Ore()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// если НПС не имеет кирки<br> * *if(Npc_HasItems(self,ItMw_2H_Axe_L_01) == 0)<br> * *{<br> * * * *// создать в инвентаре НПС кирку<br> * * * *CreateInvItem(self,ItMw_2H_Axe_L_01); * * * * * * * <br> * *};<br> * *// взять в руки кирку<br> * *EquipItem(self,ItMw_2H_Axe_L_01);<br>};<br><br>// Функция цикла состояния<br>func int ZS_Pick_Ore_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и залежи руды имеются<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"ORE"))<br> * *{<br> * * * *// добыча руды<br> * * * *AI_UseMob(self,"ORE",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Pick_Ore_End()<br>{<br> * *// прекратить добычу руды<br> * *AI_UseMob(self,"ORE",-1);<br>};<br><br>... ещё файл<br><br>// *****************<br>// Игра на лютне<br>// *****************<br><br>func void ZS_Play_Lute()<br>{ * <br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// если НПС не имеет лютни<br> * *if(Npc_HasItems(self,ItMi_Lute) == 0)<br> * *{<br> * * * *// создать в инвентаре НПС лютню<br> * * * *CreateInvItem(self,ItMi_Lute);<br> * *}; *<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br> * *<br>// Функция цикла состояния<br>func int ZS_Play_Lute_Loop()<br>{<br> * *// если НПС на нужном фрипоинте<br> * *if(Npc_IsOnFP(self,"STAND"))<br> * *{ * <br> * * * *// выравнивание<br> * * * *AI_AlignToFP(self);<br> * * * *// если НПС шел на фрипоинт<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *}; *<br> * *} * <br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"STAND"))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"STAND");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выровняться<br> * * * *AI_AlignToFP(self);<br> * * * *// установить флаг перемещения<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;<br> * *}<br> * *else // фрипоинт занят<br> * *{<br> * * * *// выровняться на вайпоинте<br> * * * *AI_AlignToWP(self);<br> * * * *// если НПС шел в точку<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *};<br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// играть на лютне<br> * * * *AI_UseItemToState(self,ItMi_Lute,1);<br> * * * *// установить флаг выполнения нужной функции<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Play_Lute_End()<br>{<br> * *// прекратить игру на лютне<br> * *AI_UseItemToState(self,ItMi_Lute,-1);<br>};<br><br>... ещё файл<br><br>// ************************************<br>// Приготовление алхимических напитков<br>// ************************************<br><br>// Функция инициализации состояния<br>func void ZS_Potion_Alchemy()<br>{ * <br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// если НПС не имеет Лабораторной колбы<br> * *if(Npc_HasItems(self,ItMi_Flask) == 0)<br> * *{<br> * * * *// создать в инвентаре НПС Лабораторную колбу<br> * * * *CreateInvItem(self,ItMi_Flask); * * * * * * <br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Potion_Alchemy_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и лабораторный стол имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"LAB"))<br> * *{<br> * * * *// изготовление напитка<br> * * * *AI_UseMob(self,"LAB",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Potion_Alchemy_End()<br>{<br> * *// прекратить алхимию<br> * *AI_UseMob(self,"LAB",-1);<br>};<br><br>... ещё файл<br><br>// *****************************<br>// Тренировка магии<br>// *****************************<br><br>// Функция инициализации состояния<br>func void ZS_Practice_Magic()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Practice_Magic_Loop()<br>{<br> * *// если НПС на нужном фрипоинте<br> * *if(Npc_IsOnFP(self,"STAND"))<br> * *{ <br> * * * *// выравнивание<br> * * * *AI_AlignToFP(self);<br> * * * *// если НПС шел на фрипоинт<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *} <br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"STAND"))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"STAND");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выровняться<br> * * * *AI_AlignToFP(self);<br> * * * *// установить флаг перемещения<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;<br> * *}<br> * *else // фрипоинт занят<br> * *{<br> * * * *// выровняться на вайпоинте<br> * * * *AI_AlignToWP(self); <br> * * * *// если НПС шел в точку<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK )<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *}; *<br> * *}; <br> * *// если время состояния > 7сек и флаг сброшен<br> * *if((Npc_GetStateTime(self) > 7) && (self.aivar[AIV_TAPOSITION] == NOTINPOS))<br> * *{<br> * * * *var int zufall;<br> * * * *zufall = Hlp_Random(100);<br> * * * *// с разной вероятностью выполнять магические упражнения<br> * * * *if(zufall <= 25)<br> * * * *{<br> * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC");<br> * * * *}<br> * * * *else if(zufall <= 50)<br> * * * *{<br> * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC2");<br > * * * *}<br> * * * *else if(zufall <= 70)<br> * * * *{<br> * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC3");<br > * * * *}<br> * * * *else if(zufall <= 90)<br> * * * *{<br> * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC4");<br > * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *AI_PlayAni(self,"R_SCRATCHHEAD");<br> * * * *};<br> * * * *// сброс времени состояния<br> * * * *Npc_SetStateTime(self,0);<br> * *}; *<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Practice_Magic_End()<br>{<br>};<br><br>... ещё файл<br><br>// **********************<br>// Упражнения с мечом<br>// **********************<br><br>// Функция инициализации состояния<br>func void ZS_Practice_Sword()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); *<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * * * *// выравнивание<br> * * * *AI_AlignToWP(self);<br> * *};<br> * *// взять в руки лучшее оружие ближнего радиуса поражения<br> * *AI_EquipBestMeleeWeapon(self);<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Функция цикла состояния<br>func int ZS_Practice_Sword_Loop()<br>{ * <br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// если НПС не имеет оружия ближнего радиуса поражения<br> * * * *if(!Npc_HasEquippedMeleeWeapon(self))<br> * * * *{<br> * * * * * *// создать в инвентаре НПС Тяжелую палку<br> * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1);<br> * * * * * *// взять её в руки<br> * * * * * *AI_EquipBestMeleeWeapon(self);<br> * * * *};<br> * * * *// подготовиться<br> * * * *AI_ReadyMeleeWeapon(self);<br> * * * *// установка флага готовности<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *};<br> * *// анимация упражнений<br> * *AI_PlayAni(self,"T_1HSFREE");<br> * *// движение на свой вайпоинт<br> * *AI_GotoWP(self,self.wp);<br> * *// выравняться<br> * *AI_AlignToWP(self);<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Practice_Sword_End()<br>{<br> * *// встать<br> * *AI_StandUp(self);<br> * *// убрать оружие<br> * *AI_RemoveWeapon(self);<br>};<br><br>
|
Re: Уроки скриптологии
Вот-с, сподобился наконец-то обновить файлик :D :D<br>Теперь в .chm - вроде удобней ;)
|
Re: Уроки скриптологии
// *************************<br>// Молитва статуям Инноса<br>// *************************<br><br>// Функция инициализации состояния<br>func void ZS_Pray_Innos()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self, self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Pray_Innos_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и статуя имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"INNOS"))<br> * *{<br> * * * *// молитва<br> * * * *AI_UseMob(self,"INNOS",1);<br> * *};<br> * *// если прошло > 5 сек и и действие прерываемо<br> * *if(Npc_GetStateTime(self) > 5) && (C_BodyStateContains(self,BS_MOBINTERACT_INTERRUPT ))<br> * *{<br> * * * *// сброс времени состояния<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Pray_Innos_End()<br>{<br> * *// прекратить молитву<br> * *AI_UseMob(self,"INNOS",-1);<br>};<br><br>... ещё файл<br><br>// **************************************<br>// Молитва Инносу на заданной точке PRAY<br>// **************************************<br><br>// Функция инициализации состояния<br>func void ZS_Pray_Innos_FP()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *}; * * *<br>};<br><br>// Функция цикла состояния<br>func int ZS_Pray_Innos_FP_Loop()<br>{<br> * *// если НПС на нужном фрипоинте<br> * *if(Npc_IsOnFP(self,"PRAY"))<br> * *{<br> * * * *// если НПС не сидит<br> * * * *if(!C_BodyStateContains(self,BS_SIT))<br> * * * *{<br> * * * * * *// выравнивание<br> * * * * * *AI_AlignToFP(self);<br> * * * * * *// анимация молитвы<br> * * * * * *AI_PlayAniBS(self,"T_STAND_2_PRAY",BS_S IT); * * <br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// анимация молитвы<br> * * * * * *AI_PlayAniBS(self,"T_PRAY_RANDOM",BS_SI T);<br> * * * *}; * * *<br> * *}<br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"PRAY"))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"PRAY");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выровняться<br> * * * *AI_AlignToFP(self);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Pray_Innos_FP_End()<br>{<br> * *// закончить молитву<br> * *NPC_StopAni(self,"T_PRAY_RANDOM");<br> * *// анимация перехода в стоячее состояние<br> * *AI_PlayAni(self,"T_PRAY_2_STAND"); *<br>};<br><br>... ещё файл<br><br>// ************************<br>// Молитва статуям Белиара <br>// ************************<br>// Примечание: В скриптах не используется, может быть удалена c корректировкой файла ТА.d<br><br>// Функция инициализации состояния<br>func void ZS_Pray_Sleeper()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Pray_Sleeper_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и статуя имеется<br> * *if(!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) && (Wld_IsMobAvailable(self,"IDOL"))<br> * *{<br> * * * *// молитва<br> * * * *AI_UseMob(self,"IDOL",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Pray_Sleeper_End()<br>{<br> * *// прекратить молитву<br> * *AI_UseMob(self,"IDOL",-1);<br>};<br><br>... ещё файл<br><br>// ****************************************<br>// Молитва Белиару на заданной точке PRAY<br>// ****************************************<br>// Аналогична молитве Инносу на такой же точке<br>// Примечание: В скриптах не используется, может быть удалена c корректировкой файла ТА.d<br><br>func void ZS_Pray_Sleeper_FP()<br>{<br> * *Perception_Set_Normal();<br> * *B_ResetAll(self);<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *AI_GotoWP(self,self.wp);<br> * *}; * * *<br>};<br><br>func int ZS_Pray_Sleeper_FP_Loop()<br>{<br> * *if(Npc_IsOnFP(self,"PRAY"))<br> * *{ * <br> * * * *if(!C_BodyStateContains(self,BS_SIT))<br> * * * *{<br> * * * * * *AI_PlayAniBS(self,"T_STAND_2_PRAY",BS_S IT); * * <br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *AI_PlayAniBS(self,"T_PRAY_RANDOM",BS_SI T);<br> * * * *}; * * *<br> * *}<br> * *else if(Wld_IsFPAvailable(self,"PRAY"))<br> * *{<br> * * * *AI_GotoFP(self,"PRAY");<br> * * * *AI_StandUp(self);<br> * * * *AI_AlignToFP(self);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>func void ZS_Pray_Sleeper_FP_End()<br>{<br> * *AI_PlayAni(self,"T_PRAY_2_STAND"); *<br>};<br><br>... ещё файл<br><br>// *********************<br>// Проповедь Ватраса<br>// *********************<br><br>// Функция инициализации состояния<br>func void ZS_Preach_Vatras()<br>{ * <br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// запретить реакцию на тихие звуки<br> * *Npc_PercDisable(self,PERC_ASSESSQUIETSOUND);<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// движение на свой вайпоинт<br> * *AI_GotoWP(self,self.wp);<br> * *// выравняться<br> * *AI_AlignToWP(self);<br>};<br><br>// Функция цикла состояния<br>func int ZS_Preach_Vatras_loop()<br>{<br> * *// если прошло >= 13 сек<br> * *if(Npc_GetStateTime(self) >= 13)<br> * *{<br> * * * *// если кол-во произнесенных фраз > 20<br> * * * *if(self.aivar[AIV_TAPOSITION] > 20)<br> * * * *{<br> * * * * * *// начать с начала<br> * * * * * *self.aivar[AIV_TAPOSITION] = 0;<br> * * * *};<br> * * * *// чтение текста проповеди<br> * * * *B_Preach_Vatras(self.aivar[AIV_TAPOSITION]);<br> * * * *// переход на следующую фразу<br> * * * *self.aivar[AIV_TAPOSITION] = self.aivar[AIV_TAPOSITION] + 1; * * * *<br> * * * *// сброс времени состояния<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Preach_Vatras_end()<br>{<br>}; *<br><br>... ещё файл<br><br>// *********************<br>// Работа в поле<br>// *********************<br><br>// Функция инициализации состояния<br>func void ZS_Rake_FP()<br>{ * <br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// если НПС не имеет мотыги<br> * *if(Npc_HasItems(self,ItMi_Rake) == 0)<br> * *{<br> * * * *// создать в инвентаре НПС мотыгу<br> * * * *CreateInvItem (self,ItMi_Rake);<br> * *};<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br> * *<br>// Функция цикла состояния<br>func int ZS_Rake_FP_Loop()<br>{<br> * *// если НПС на нужном фрипоинте<br> * *if(Npc_IsOnFP(self,"PICK"))<br> * *{ * <br> * * * *// выравнивание<br> * * * *AI_AlignToFP(self);<br> * * * *// если НПС шел на фрипоинт<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *} * <br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"PICK"))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"PICK");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выравняться<br> * * * *AI_AlignToFP(self);<br> * * * *// установить флаг перемещения<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;<br> * *}<br> * *else // фрипоинт занят<br> * *{<br> * * * *// выравняться на вайпоинте<br> * * * *AI_AlignToWP(self);<br> * * * *// если НПС шел в точку<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *}; <br> * *};<br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// работать мотыгой<br> * * * *AI_UseItemToState(self,ItMi_Rake,1); * *<br> * * * *// установить флаг выполнения нужной функции<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *}; *<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Rake_FP_End()<br>{<br> * *// прекратить использовать мотыгу<br> * *AI_UseItemToState(self,ItMi_Rake,-1);<br>};<br><br>
|
Re: Уроки скриптологии
// ****************<br>// Чтение книг<br>// ****************<br><br>// Функция инициализации состояния<br>func void ZS_Read_Bookstand()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Read_Bookstand_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и подставка с кникой имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BOOK"))<br> * *{<br> * * * *// читать книгу<br> * * * *AI_UseMob(self,"BOOK",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Read_Bookstand_End()<br>{<br> * *// прекратить чтение<br> * *AI_UseMob(self,"BOOK",-1);<br>};<br><br>... ещё файл<br><br>// ****************<br>// Ремонт хижины<br>// ****************<br><br>// Функция инициализации состояния<br>func void ZS_Repair_Hut()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Repair_Hut_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и хижина имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"REPAIR"))<br> * *{<br> * * * *// ремонт<br> * * * *AI_UseMob(self,"REPAIR",1);<br> * *};<br> * *// если прошло > 5 сек и и действие прерываемо<br> * *if(Npc_GetStateTime(self) > 5) && (C_BodyStateContains(self,BS_MOBINTERACT_INTERRUPT ))<br> * *{<br> * * * *var int zufall;<br> * * * *zufall = Hlp_Random(100);<br> * * * *// с вероятностью 0.5<br> * * * *if(zufall < 50)<br> * * * *{<br> * * * * * *// изменение анимации<br> * * * * * *AI_PlayAniBS(self,"T_REPAIR_RANDOM_1",B S_MOBINTERACT_INTERRUPT);<br> * * * *};<br> * * * *// сброс времени состояния<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Repair_Hut_End()<br>{<br> * *// прекратить ремонт<br> * *AI_UseMob(self,"REPAIR",-1);<br>};<br><br>... ещё файл<br><br>// ************************<br>// Барбекю из Падальщика<br>// ************************<br><br>// Функция инициализации состояния<br>func void ZS_Roast_Scavenger()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Roast_Scavenger_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и вертел имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BARBQ"))<br> * *{<br> * * * *// жарим мясо<br> * * * *AI_UseMob(self,"BARBQ",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Roast_Scavenger_End()<br>{<br> * *// прекратить жарку<br> * *AI_UseMob(self,"BARBQ",-1);<br>};<br><br>... ещё файл<br><br>// ************************************<br>// НПС бежит на охраняемую точку<br>// ************************************<br><br>// Функция инициализации состояния<br>func void ZS_RunToWP()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения бегом<br> * *AI_SetWalkmode(self,NPC_RUN);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// выравнивание <br> * *AI_AlignToWP(self);<br> * *// встать в положение охраны<br> * *AI_PlayAni(self,"T_STAND_2_HGUARD");<br >};<br><br>// Функция цикла состояния<br>func int ZS_RunToWP_Loop()<br>{ * <br> * *// если время состояния > 5 сек<br> * *if(Npc_GetStateTime(self) > 5)<br> * *{<br> * * * *var int random;<br> * * * *random = Hlp_Random(2);<br> * * * *// с вероятностью 0.5<br> * * * *if(random == 0)<br> * * * *{<br> * * * * * *// осмотр окрестностей<br> * * * * * *AI_PlayAni(self,"T_HGUARD_LOOKAROUND"); <br> * * * *};<br> * * * *// сброс времени состояния<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br> * *<br>// Функция завершения состояния<br>func int ZS_RunToWP_End()<br>{ * <br>};<br><br>... ещё файл<br><br>// ****************************<br>// Распиловка древесины<br>// ****************************<br><br>// Функция инициализации состояния<br>func void ZS_Saw()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Saw_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и козлы с кряжем имеются<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BAUMSAEGE"))<b r> * *{<br> * * * *// пилим кряж<br> * * * *AI_UseMob(self,"BAUMSAEGE",1);<br> * *};<br> * *// если прошло > 15 сек и и действие прерываемо<br> * *if(Npc_GetStateTime(self) > 15) && (C_BodyStateContains(self,BS_MOBINTERACT_INTERRUPT ))<br> * *{<br> * * * *// сброс времени состояния<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Saw_End()<br>{<br> * *// прекратить пиление<br> * *AI_UseMob(self,"BAUMSAEGE",-1);<br>};<br><br>... ещё файл<br><br>// ***********************<br>// Мини диалог между НПС<br>// ***********************<br>// other - ближайший НПС<br><br>const int SmallTalkFreq = 4; * *// периодичность разговора в сек<br><br>// Функция инициализации состояния<br>func void ZS_Smalltalk()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Smalltalk_Loop()<br>{<br> * *// если НПС на фрипоинте<br> * *if(Npc_IsOnFP(self,"SMALLTALK"))<br> * *{ * <br> * * * *// если время состояния >= периодичности разговора * 2<br> * * * *if(Npc_GetStateTime(self) >= (SmallTalkFreq * 2))<br> * * * *{<br> * * * * * *// НПС разрешено воспринимать все объекты в зоне действия восприятия<br> * * * * * *Npc_PerceiveAll(self);<br> * * * * * *// если собеседник найден (другой НПС, находящийся в состоянии мини диалога (инициализация other))<br> * * * * * *if(Wld_DetectNpc(self,-1,ZS_Smalltalk,-1))<br> * * * * * *{<br> * * * * * * * *// если расстояние между НПС < дистанции начала диалога<br> * * * * * * * *if(Npc_GetDistToNpc(self,other) < PERC_DIST_DIALOG)<br> * * * * * * * *{<br> * * * * * * * * * *// установить собеседнику время диалога<br> * * * * * * * * * *Npc_SetStateTime(other,SmallTalkFreq);<br> * * * * * * * * * *// НПС поворачивается к собеседнику<br> * * * * * * * * * *B_TurnToNpc(self,other);<br> * * * * * * * * * *// сам диалог<br> * * * * * * * * * *B_Say_Smalltalk();<br> * * * * * * * *};<br> * * * * * *};<br> * * * * * *// сброс времени состояния<br> * * * * * *Npc_SetStateTime(self,0);<br> * * * *};<br> * *}<br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"SMALLTALK"))< br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"SMALLTALK");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выравняться<br> * * * *AI_AlignToFP(self);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Smalltalk_End()<br>{<br>};<br><br>
|
Re: Уроки скриптологии
// *****************<br>// Сидеть на скамье<br>// *****************<br><br>// Функция инициализации состояния<br>func void ZS_Sit_Bench()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// если НПС не сидит<br> * *if(!C_BodyStateContains(self,BS_SIT))<br> * *{<br> * * * *// установить режим передвижения шагом<br> * * * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * * * *// если НПС расположен не на своем вайпоинте<br> * * * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * * * *{<br> * * * * * *// движение на свой вайпоинт<br> * * * * * *AI_GotoWP(self,self.wp);<br> * * * *};<br> * *}; *<br>};<br><br>// Функция цикла состояния<br>func int ZS_Sit_Bench_Loop()<br>{<br> * *// если НПС не сидит и скамья имеется<br> * *if(!C_BodyStateContains(self,BS_SIT)) && (Wld_IsMobAvailable(self,"BENCH"))<br> * *{<br> * * * *// сесть на скамью<br> * * * *AI_UseMob(self,"BENCH",1);<br> * *};<br> * *// есил НПС сидит и прошло > 5 сек<br> * *if(C_BodyStateContains(self,BS_SIT)) && (Npc_GetStateTime(self) > 5)<br> * *{<br> * * * *var int random;<br> * * * *random = Hlp_Random(8 );<br> * * * *// случайная анимация движений на скамье<br> * * * *if(random <= 0) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_1",BS_ SIT); };<br> * * * *if(random <= 1) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_2",BS_ SIT); };<br> * * * *if(random <= 2) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_3",BS_ SIT); };<br> * * * *if(random <= 3) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_4",BS_ SIT); };<br> * * * *// сброс времени состояния<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Sit_Bench_End()<br>{<br> * *// НПС встает со скамьи<br> * *AI_UseMob(self,"BENCH",-1);<br>};<br><br>... ещё файл<br><br>// *******************<br>// Сидеть у костра<br>// *******************<br><br>// Функция инициализации состояния<br>func void ZS_Sit_Campfire()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// если НПС не сидит * *<br> * *if(!C_BodyStateContains(self,BS_SIT))<br> * *{<br> * * * *// установить режим передвижения шагом<br> * * * *AI_SetWalkmode(self,NPC_WALK);<br> * * * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * * * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * * * *{<br> * * * * * *// движение на свой вайпоинт<br> * * * * * *AI_GotoWP(self,self.wp);<br> * * * *};<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Sit_Campfire_loop()<br>{<br> * *// если НПС на фрипоинте и не сидит<br> * *if((Npc_IsOnFP(self,"CAMPFIRE")) && (!C_BodyStateContains(self,BS_SIT)))<br> * *{ * <br> * * * *// выравнивание<br> * * * *AI_AlignToFP(self);<br> * * * *// НПС садиться<br> * * * *AI_PlayAniBS(self,"T_STAND_2_SIT",BS_SI T);<br> * *}<br> * *// если фрипоинт существует, свободен и НПС не сидит<br> * *else if((Wld_IsFPAvailable(self,"CAMPFIRE")) && (!C_BodyStateContains(self,BS_SIT)))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"CAMPFIRE");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выровняться<br> * * * *AI_AlignToFP(self);<br> * *}; *<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Sit_Campfire_end()<br>{<br> * *// НПС встает<br> * *AI_PlayAniBS(self,"T_SIT_2_STAND",BS_ST AND); * *<br>};<br><br>... ещё файл<br><br>// *****************<br>// Сидеть на стуле<br>// *****************<br>// Примечание: полностью аналогична функции "Сидеть на скамье", только используется другой МОВ<br><br>func void ZS_Sit_Chair()<br>{<br> * *Perception_Set_Normal();<br> * *B_ResetAll(self);<br> * *if(!C_BodyStateContains(self,BS_SIT))<br> * *{<br> * * * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * * * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * * * *{<br> * * * * * *AI_GotoWP(self,self.wp);<br> * * * *};<br> * *}; *<br>};<br><br>func int ZS_Sit_Chair_Loop()<br>{<br> * *if(!C_BodyStateContains(self,BS_SIT)) && (Wld_IsMobAvailable(self,"CHAIR"))<br> * *{<br> * * * *AI_UseMob(self,"CHAIR",1);<br> * *};<br> * *if(C_BodyStateContains(self,BS_SIT)) && (Npc_GetStateTime(self) > 5)<br> * *{<br> * * * *var int random;<br> * * * *random = Hlp_Random(10);<br> * * * *if(random <= 0) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_1",BS_ SIT); };<br> * * * *if(random <= 1) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_2",BS_ SIT); };<br> * * * *if(random <= 2) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_3",BS_ SIT); };<br> * * * *if(random <= 3) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_4",BS_ SIT); };<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>func void ZS_Sit_Chair_End()<br>{<br> * *AI_UseMob(self,"CHAIR",-1);<br>};<br><br>... ещё файл<br><br>// *************************<br>// Сидеть на троне<br>// *************************<br><br>// Функция инициализации состояния<br>func void ZS_Sit_Throne()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// если НПС не сидит<br> * *if(!C_BodyStateContains(self,BS_SIT))<br> * *{<br> * * * *// установить режим передвижения шагом<br> * * * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * * * *// если НПС расположен не на своем вайпоинте<br> * * * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * * * *{<br> * * * * * *// движение на свой вайпоинт<br> * * * * * *AI_GotoWP(self, self.wp);<br> * * * *};<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Sit_Throne_Loop()<br>{<br> * *// если НПС не сидит и трон имеется<br> * *if(!C_BodyStateContains(self, BS_SIT)) && (Wld_IsMobAvailable(self,"THRONE"))<br> * *{<br> * * * *// сесть на трон<br> * * * *AI_UseMob(self,"THRONE",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Sit_Throne_End()<br>{<br> * *// встать с трона<br> * *AI_UseMob(self,"THRONE",-1);<br>};<br><br>... ещё файл<br><br>// *****************<br>// Спать на кровати<br>// *****************<br><br>// Функция инициализации состояния (идти к кровати)<br>func void ZS_GotoBed()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// переход с состояние спать<br> * *AI_StartState(self,ZS_Sleep,0,"");<br>} ;<br><br>// Локальное восприятие разговора<br>func void B_AssessSleepTalk()<br>{<br> * *// если НПС лежит<br> * *if(C_BodyStateContains(self,BS_LIE))<br> * *{<br> * * * *// прекратить лежать<br> * * * *AI_UseMob(self,"BEDHIGH",-1);<br> * *};<br> * *// перейти в состояние наблюдения за ГГ<br> * *AI_StartState(self,ZS_ObservePlayer,0,"" ;);<br>};<br><br>// Функция инициализации состояния<br>func void ZS_Sleep()<br>{<br> * *// разрешить восприятие тихих звуков<br> * *Npc_PercEnable(self,PERC_ASSESSQUIETSOUND,B_Asses sQuietSound);<br> * *// разрешить восприятие повреждений<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);<br> * *// локальное восприятие разговора<br> * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessSleep Talk);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br>};<br> * * * *<br>// Функция цикла состояния<br>func int ZS_Sleep_Loop() * *<br>{<br> * *// если НПС не лежит<br> * *if(!C_BodyStateContains(self,BS_LIE))<br> * *{<br> * * * *// если кровать имеется и свободна<br> * * * *if(Wld_IsMobAvailable(self,"BEDHIGH"))< br> * * * *{<br> * * * * * *// лечь спать<br> * * * * * *AI_UseMob(self,"BEDHIGH",1);<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// если комментария, что ГГ лежит на чужой кровати не было и ГГ лежит и расстояние между НПС и ГГ <= 5 м<br> * * * * * *if(Player_GetOutOfMyBedComment == FALSE) && (C_BodyStateContains(hero,BS_LIE)) && (Npc_GetDistToNpc(self,hero) <= 500)<br> * * * * * *{<br> * * * * * * * *// НПС поворачивается к ГГ<br> * * * * * * * *B_TurnToNpc(self,hero);<br> * * * * * * * *// произносит ГГ SVM фразу "Вон с моей кровати!"<br> * * * * * * * *B_Say(self,other,"$GETOUTOFMYBED");<br> * * * * * * * *// установить флаг состоявшегося комментария<br> * * * * * * * *Player_GetOutOfMyBedComment = TRUE;<br> * * * * * *};<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Sleep_End()<br>{<br> * *// если НПС находится в помещении вместе с ГГ<br> * *if(!Npc_IsInPlayersRoom(self))<br> * *{<br> * * * *// НПС зевает<br> * * * *B_Say(self,self,"$AWAKE");<br> * *};<br> * *// встает с кровати<br> * *AI_UseMob(self,"BEDHIGH",-1);<br>};<br><br>... ещё файл<br><br>// ******************************<br>// Очень крепко спать на кровати<br>// ******************************<br>// Примечание: от предыдущего обработчика отличается только тем, что у НПС закрыто восприятие тихих звуков.<br>// В скриптах не используется, может быть удален с коррекцией файла TA.d<br><br>func void ZS_GotoBed_Deep()<br>{<br> * *Perception_Set_Normal();<br> * *B_ResetAll(self);<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *AI_StartState(self,ZS_Sleep_Deep,0,""); <br>};<br><br>func void ZS_Sleep_Deep()<br>{<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);<br> * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessSleep Talk);<br> * *AI_SetWalkmode(self,NPC_WALK);<br>};<br> * * * *<br>func int ZS_Sleep_Deep_Loop() * <br>{<br> * *if(!C_BodyStateContains(self,BS_LIE))<br> * *{<br> * * * *if(Wld_IsMobAvailable(self,"BEDHIGH"))< br> * * * *{<br> * * * * * *AI_UseMob(self,"BEDHIGH",1);<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *if(Player_GetOutOfMyBedComment == FALSE) && (C_BodyStateContains(hero,BS_LIE)) && (Npc_GetDistToNpc(self,hero) <= 500)<br> * * * * * *{<br> * * * * * * * *B_TurnToNpc(self,hero);<br> * * * * * * * *B_Say(self,other,"$GETOUTOFMYBED");<br> * * * * * * * *Player_GetOutOfMyBedComment = TRUE;<br> * * * * * *};<br> * * * *};<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>func void ZS_Sleep_Deep_End()<br>{<br> * *if(!Npc_IsInPlayersRoom(self))<br> * *{<br> * * * *B_Say(self,self,"$AWAKE");<br> * *};<br> * *AI_UseMob(self,"BEDHIGH",-1);<br>};<br><br>
|
Re: Уроки скриптологии
// ****************************************<br>// Использование наковальни (ковка оружия)<br>// ****************************************<br><br>// Функция инициализации состояния<br>func void ZS_Smith_Anvil()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Smith_Anvil_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и наковальня имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BSANVIL"))<br> * *{<br> * * * *// ковка оружия<br> * * * *AI_UseMob(self,"BSANVIL",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Smith_Anvil_End()<br>{<br> * *// прекратить ковку<br> * *AI_UseMob(self,"BSANVIL",-1);<br>};<br><br>... ещё файл<br><br>// ****************************<br>// Закалка заготовки оружия<br>// ****************************<br><br>// Функция инициализации состояния<br>func void ZS_Smith_Cool()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Smith_Cool_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и ванна с водой имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BSCOOL"))<br> * *{<br> * * * *// закалка заготовки<br> * * * *AI_UseMob(self,"BSCOOL",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Smith_Cool_End()<br>{<br> * *// прекратить закалку<br> * *AI_UseMob(self,"BSCOOL",-1);<br>};<br><br>... ещё файл<br><br>// **********************************<br>// Разогрев заготовки оружия в горне<br>// **********************************<br><br>// Функция инициализации состояния<br>func void ZS_Smith_Fire()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Smith_Fire_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и горн имеется<br> * *if(!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) && (Wld_IsMobAvailable(self,"BSFIRE"))<br> * *{<br> * * * *// разогрев заготовки<br> * * * *AI_UseMob(self,"BSFIRE",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Smith_Fire_End()<br>{<br> * *// прекратить разогрев<br> * *AI_UseMob(self,"BSFIRE",-1);<br>};<br><br>... ещё файл<br><br>// *****************<br>// Заточка оружия<br>// *****************<br><br>// Функция инициализации состояния<br>func void ZS_Smith_Sharp()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если НПС расположен не на своем вайпоинте<br> * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)<br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Smith_Sharp_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и точило имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BSSHARP"))<br> * *{<br> * * * *// заточка<br> * * * *AI_UseMob(self,"BSSHARP",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Smith_Sharp_End()<br>{<br> * *// прекратить заточку<br> * *AI_UseMob(self,"BSSHARP",-1);<br>};<br><br>... ещё файл<br><br>// ********************<br>// Курение болотника<br>// ********************<br><br>// Функция инициализации состояния<br>func void ZS_Smoke_Joint()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// если НПС не имеет Обработанного болотника<br> * *if(Npc_HasItems(self,ItMi_Joint) == 0)<br> * *{<br> * * * *// создать в инвентаре НПС болотник<br> * * * *CreateInvItem(self,ItMi_Joint);<br> * *};<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Функция цикла состояния<br>func int ZS_Smoke_Joint_loop()<br>{<br> * *// если НПС на нужном фрипоинте<br> * *if(Npc_IsOnFP(self,"STAND"))<br> * *{<br> * * * *// выравнивание<br> * * * *Ai_AlignToFP(self);<br> * * * *// если НПС шел на фрипоинт<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *} * <br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"STAND"))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"STAND");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выравняться<br> * * * *AI_AlignToFP(self);<br> * * * *// установить флаг перемещения<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;<br> * *}<br> * *else // фрипоинт занят<br> * *{<br> * * * *// выравняться на вайпоинте<br> * * * *AI_AlignToWP(self);<br> * * * *// если НПС шел в точку<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *};<br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// курить болотник<br> * * * *AI_UseItemToState(self,ItMi_JOINT,0);<br> * * * *// установить флаг выполнения нужной функции<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *}; * * * * *<br> * *// если прошло > 5 сек и НПС находится в режиме курения<br> * *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))<br> * *{<br> * * * *// анимация курения (дым)<br> * * * *AI_PlayAniBS(self,"T_JOINT_RANDOM_1",BS _ITEMINTERACT);<br> * * * *// сброс времени цикла<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Smoke_Joint_end()<br>{<br> * *// прекратить курить<br> * *AI_UseItemToState(self,ItMi_Joint,-1);<br>};<br><br>... ещё файл<br><br>// *******************<br>// Курение кальяна<br>// *******************<br><br>// Функция инициализации состояния<br>func void ZS_Smoke_Waterpipe()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Smoke_Waterpipe_Loop()<br>{<br> * *// если действие с МОВом не прерываемо и кальян имеется<br> * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"SMOKE"))<br> * *{<br> * * * *// курим кальян<br> * * * *AI_UseMob(self,"SMOKE",1);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Smoke_Waterpipe_End()<br>{<br> * *// прекратить курение<br> * *AI_UseMob(self,"SMOKE",-1);<br>};<br><br>... ещё файл<br><br>// ****************<br>// Игра с факелами<br>// ****************<br><br>// Функция инициализации состояния<br>func void ZS_Spit_Fire()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// если НПС не имеет горящего факела<br> * *if(Npc_HasItems(self,ItLsTorchFirespit) == 0)<br> * *{<br> * * * *// создать в инвентаре НПС горящий факел<br> * * * *CreateInvItem(self,ItLsTorchFirespit);<br> * *};<br>};<br><br>// Функция цикла состояния<br>func int ZS_Spit_Fire_Loop()<br>{<br> * *// если фрипоинт существует и свободен<br> * *if(Wld_IsFPAvailable(self,"STAND"))<br> * *{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * <br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"STAND");<br> * * * *// выравняться<br> * * * *AI_ALignToFP(self);<br> * *}<br> * *else // фрипоинт занят<br> * *{<br> * * * *// выравняться на вайпоинте<br> * * * *AI_AlignToWP(self); <br> * *};<br> * *// если прошло > 10 сек<br> * *if(Npc_GetStateTime(self) > 10)<br> * *{<br> * * * *// использовать факел (5 фаза)<br> * * * *AI_UseItemToState(self,ItLsTorchFirespit,5);<br> * * * *// использовать факел (0 фаза)<br> * * * *AI_UseItemToState(self,ItLsTorchFirespit,0);<br> * * * *// сброс времени цикла<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Spit_Fire_end()<br>{<br> * *// оставить факел<br> * *AI_UseItemToState(self,ItLsTorchFirespit,-1);<br>};<br><br>
|
Re: Уроки скриптологии
// **********************<br>// Стоять скрестив руки<br>// **********************<br><br>// Функция инициализации состояния<br>func void ZS_Stand_ArmsCrossed()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK); * * *<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Функция цикла состояния<br>func int ZS_Stand_ArmsCrossed_Loop()<br>{<br> * *// если НПС на нужном фрипоинте<br> * *if(Npc_IsOnFP(self,"STAND"))<br> * *{ * <br> * * * *// выравнивание<br> * * * *AI_AlignToFP(self);<br> * * * *// если НПС шел на фрипоинт<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *} * <br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"STAND"))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"STAND");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выравняться<br> * * * *AI_AlignToFP(self);<br> * * * *// установить флаг перемещения<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;<br> * *}<br> * *else // фрипоинт занят<br> * *{<br> * * * *// выравняться на вайпоинте<br> * * * *AI_AlignToWP(self);<br> * * * *// если НПС шел в точку<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *}; <br> * *};<br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// стоять скрестив руки (режим охраны)<br> * * * *AI_PlayAni(self,"T_STAND_2_LGUARD");<br > * * * *// установить флаг выполнения нужной функции<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *};<br> * *// если прошло > 5 сек и НПС находится в режиме охраны<br> * *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))<br> * *{<br> * * * *var int random;<br> * * * *random = Hlp_Random(7);<br> * * * *// случайная анимация движений<br> * * * *if(random == 0)<br> * * * *{<br> * * * * * *AI_PlayAni(self,"T_LGUARD_SCRATCH");<br > * * * *}<br> * * * *else if(random == 1)<br> * * * *{<br> * * * * * *AI_PlayAni(self,"T_LGUARD_STRETCH");<br > * * * *}<br> * * * *else if(random == 2)<br> * * * *{<br> * * * * * *AI_PlayAni(self,"T_LGUARD_CHANGELEG");< br> * * * *};<br> * * * *var int Eventrandy;<br> * * * *Eventrandy = Hlp_Random(200);<br> * * * *// с вероятностью 0.005 и если НПС в Яркендаре и Равен не убит и НПС не пират<br> * * * *if(Eventrandy == 1) && (CurrentLevel == ADDONWORLD_ZEN) && (RavenIsDead == FALSE) && (self.guild != GIL_PIR)<br> * * * *{<br> * * * * * *// проиграть эффект "Дрожь земли"<br> * * * * * *B_EVENT_PORTAL_EARTHQUAKE();<br> * * * *};<br> * * * *// сброс времени цикла<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Stand_ArmsCrossed_end()<br>{<br> * *// выйти из режима охраны<br> * *AI_PlayAni(self,"T_LGUARD_2_STAND"); * *<br>};<br><br>... ещё файл<br><br>// *****************************************<br>// Состояние ожидания Черных магов (Ищущие)<br>// *****************************************<br><br>// Функция инициализации состояния<br>func void ZS_Stand_Dementor()<br>{<br> * *// разрешить НПС все чувства<br> * *self.senses * * * * = SENSE_SEE ¦ SENSE_HEAR ¦ SENSE_SMELL; * * <br> * *// установить дальность чувств = макс. чувствительности монстров<br> * *self.senses_range * = PERC_DIST_MONSTER_ACTIVE_MAX; * * * * <br> * *<br> * *// если НПС имеет важную информацию<br> * *if(Npc_KnowsInfo(self,1))<br> * *{<br> * * * *// установить время реакции на восприятия 0.3 сек<br> * * * *Npc_SetPercTime(self,0.3);<br> * *}<br> * *else<br> * *{<br> * * * *// установить время реакции на восприятия 1 сек<br> * * * *Npc_SetPercTime(self,1);<br> * *};<br> * *// разрешить восприятие НПС на ГГ<br> * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessPla yer);<br> * *// разрешить восприятие врага<br> * *Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnem y);<br> * *// разрешить восприятие магии<br> * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);<br> * *// разрешить восприятие повреждений<br> * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);<br> * *// если НПС особенный "Черный маг"<br> * *if(Hlp_GetInstanceID(self) != Hlp_GetInstanceID(DMT_1299_OberDementor_DI))<br> * *{<br> * * * *// разрешить восприятие звуков сражения<br> * * * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sFightSound);<br> * *};<br> * *// разрешить восприятие предупреждения<br> * *Npc_PercEnable(self,PERC_ASSESSWARN,B_AssessWarn) ;<br> * *// разрешить восприятие разговора<br> * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;<br> * *// разрешить восприятие перемещения МОВа<br> * *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br><br>// Функция цикла состояния<br>func int ZS_Stand_Dementor_loop()<br>{<br> * *// если НПС на нужном фрипоинте<br> * *if(Npc_IsOnFP(self,"STAND"))<br> * *{ * <br> * * * *// выравнивание<br> * * * *AI_AlignToFP(self);<br> * * * *// если НПС шел на фрипоинт<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *} * <br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"STAND"))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"STAND");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выравняться<br> * * * *AI_AlignToFP(self);<br> * * * *// установить флаг перемещения<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;<br> * *}<br> * *else // фрипоинт занят<br> * *{<br> * * * *// выравняться на вайпоинте<br> * * * *AI_AlignToWP(self);<br> * * * *// если НПС шел в точку<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *}; <br> * *};<br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// анимация состояния охраны<br> * * * *AI_PlayAni(self,"T_STAND_2_LGUARD");<br > * * * *// установить флаг выполнения нужной функции<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Stand_Dementor_end()<br>{<br> * *// анимация прекращения действия<br> * *AI_PlayAni(self,"T_LGUARD_2_STAND"); * *<br>};<br><br>... ещё файл<br><br>// **********************<br>// Пить самогон стоя<br>// **********************<br> <br>// Функция инициализации состояния<br>func void ZS_Stand_Drinking()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// если НПС не имеет самогона<br> * *if(Npc_HasItems(self,ItFo_Booze) == 0)<br> * *{<br> * * * *// создать в инвентаре НПС бутылку самогона<br> * * * *CreateInvItem(self,ItFo_Booze);<br> * *};<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br>};<br> <br>// Функция цикла состояния<br>func int ZS_Stand_Drinking_loop()<br>{<br> * *// если НПС на нужном фрипоинте<br> * *if(Npc_IsOnFP(self,"STAND"))<br> * *{ <br> * * * *// выравнивание<br> * * * *AI_AlignToFP(self);<br> * * * *// если НПС шел на фрипоинт<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *} <br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"STAND"))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"STAND");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выравняться<br> * * * *AI_AlignToFP(self);<br> * * * *// установить флаг перемещения<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;<br> * *}<br> * *else // фрипоинт занят<br> * *{<br> * * * *// выравняться на вайпоинте<br> * * * *AI_AlignToWP(self); <br> * * * *// если НПС шел в точку<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK )<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *}; *<br> * *}; <br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// пить самогон<br> * * * *AI_UseItemToState(self,ItFo_Booze,0);<br> * * * *// установить флаг выполнения нужной функции<br> * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * *};<br> * *// если прошло > 7 сек и НПС пьет самогон<br> * *if((Npc_GetStateTime(self) > 7) && (self.aivar[AIV_TAPOSITION] == ISINPOS))<br> * *{<br> * * * *var int random;<br> * * * *random = Hlp_Random(10);<br> * * * *// случайная анимация движений<br> * * * *if (random == 0)<br> * * * *{<br> * * * * * *// осмотреть бутылку<br> * * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_3",B S_ITEMINTERACT);<br> * * * * * *// пить<br> * * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_1",B S_ITEMINTERACT);<br> * * * *}<br> * * * *else if (random == 1) <br> * * * *{<br> * * * * * *// пить<br> * * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_1",B S_ITEMINTERACT);<br> * * * * * *// утереть рот<br> * * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_2",B S_ITEMINTERACT);<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *// пить<br> * * * * * *AI_PlayAniBS (self,"T_POTION_RANDOM_1",BS_ITEMINTERAC T); //trinken<br> * * * *};<br> * * * *// сброс времени цикла<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br> <br>// Функция завершения состояния<br>func void ZS_Stand_Drinking_end ()<br>{<br> * *// прекратить пьянство<br> * *AI_UseItemToState(self,ItFo_Booze,-1);<br>};<br><br>... ещё файл<br><br>// **********************<br>// Употреблять пищу стоя<br>// **********************<br><br>// Функция инициализации состояния<br>func void ZS_Stand_Eating()<br>{<br> * *// установить нормальный набор восприятий<br> * *Perception_Set_Normal();<br> * *// перевод НПС в исходное состояние<br> * *B_ResetAll(self);<br> * *// установить режим передвижения шагом<br> * *AI_SetWalkmode(self,NPC_WALK);<br> * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций<br> * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) <br> * *{<br> * * * *// движение на свой вайпоинт<br> * * * *AI_GotoWP(self,self.wp);<br> * *};<br> * *// сброс флага цикла<br> * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * *var int random;<br> * *random = Hlp_Random(4);<br> * *// случайным образом создать в инвентаре один из предметов, если его нет * *<br> * *if(random == 0)<br> * *{<br> * * * *// Яблоко<br> * * * *if(Npc_HasItems (self,ItFo_Apple) == 0)<br> * * * *{<br> * * * * * *CreateInvItem(self,ItFo_Apple); <br> * * * *};<br> * * * *self.aivar[AIV_Food] = FOOD_Apple;<br> * *}<br> * *else if(random == 1)<br> * *{<br> * * * *// Сыр<br> * * * *if(Npc_HasItems(self,ItFo_Cheese) == 0)<br> * * * *{<br> * * * * * *CreateInvItem(self,ItFo_Cheese); * *<br> * * * *};<br> * * * *self.aivar[AIV_Food] = FOOD_Cheese;<br> * *}<br> * *else if(random == 2)<br> * *{<br> * * * *// Бекон<br> * * * *if(Npc_HasItems(self,ItFo_Bacon) == 0)<br> * * * *{<br> * * * * * *CreateInvItem(self,ItFo_Bacon); <br> * * * *}; *<br> * * * *self.aivar[AIV_Food] = FOOD_Bacon;<br> * *}<br> * *else if(random == 3) * *<br> * *{<br> * * * *// Жареное мясо<br> * * * *if(Npc_HasItems(self,ItFoMutton) == 0)<br> * * * *{<br> * * * * * *CreateInvItem(self,ItFoMutton); <br> * * * *}; *<br> * * * *self.aivar[AIV_Food] = FOOD_Bread;<br> * *}; *<br>};<br><br>// Функция цикла состояния<br>func int ZS_Stand_Eating_Loop()<br>{<br> * *// если НПС на нужном фрипоинте<br> * *if(Npc_IsOnFP(self,"STAND"))<br> * *{ * <br> * * * *// выравнивание<br> * * * *AI_AlignToFP(self);<br> * * * *// если НПС шел на фрипоинт<br> * * * *if (self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *} * <br> * *// если фрипоинт существует и свободен<br> * *else if(Wld_IsFPAvailable(self,"STAND"))<br> * *{<br> * * * *// идти на фрипоинт<br> * * * *AI_GotoFP(self,"STAND");<br> * * * *// встать<br> * * * *AI_StandUp(self);<br> * * * *// выравняться<br> * * * *AI_AlignToFP(self);<br> * * * *// установить флаг перемещения<br> * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;<br> * *}<br> * *else // фрипоинт занят<br> * *{<br> * * * *// выравняться на вайпоинте<br> * * * *AI_AlignToWP(self);<br> * * * *// если НПС шел в точку<br> * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)<br> * * * *{<br> * * * * * *// сброс флага<br> * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;<br> * * * *};<br> * *}; *<br> * *// если флаг сброшен<br> * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)<br> * *{<br> * * * *// если употребляем Яблоко<br> * * * *if(self.aivar[AIV_Food] == FOOD_Apple) *<br> * * * *{<br> * * * * * *// жевать Яблоко<br> * * * * * *AI_UseItemToState(self,ItFo_Apple,0);<br> * * * * * *// анимация<br> * * * * * *AI_PlayAniBS(self,"T_FOOD_RANDOM_2",BS_ ITEMINTERACT);<br> * * * * * *// установить флаг выполнения нужной функции<br> * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;<br> * * * *}<br> * * * *// если употребляем Сыр<br> * * * *if(self.aivar[AIV_Food] == FOOD_Cheese) * * <br> * * * *{<br> * * * * * *// жевать Сыр<br> * * * * * *AI_UseItemToState(self,ItFo_Cheese,0);<br> * * * * * *// установить флаг выполнения нужной функции<br> * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * <br> * * * *}<br> * * * *// если употребляем Бекон<br> * * * *if(self.aivar[AIV_Food] == FOOD_Bacon)<br> * * * *{ * <br> * * * * * *// жевать Бекон<br> * * * * * *AI_UseItemToState(self,ItFo_Bacon,0);<br> * * * * * *// установить флаг выполнения нужной функции<br> * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * <br> * * * *}<br> * * * *// если употребляем Жареное мясо<br> * * * *if(self.aivar[AIV_Food] == FOOD_Bread)<br> * * * *{ * <br> * * * * * *// жевать Яблоко<br> * * * * * *AI_UseItemToState(self,ItFoMutton,0);<br> * * * * * *// установить флаг выполнения нужной функции<br> * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * <br> * * * *};<br> * *}; * * *<br> * *// если прошло > 5 сек и НПС жует<br> * *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))<br> * *{<br> * * * *// анимация жевания разной пищи<br> * * * *if(self.aivar[AIV_Food] == FOOD_Apple)<br> * * * *{<br> * * * * * *AI_PlayAniBS(self,"T_FOOD_RANDOM_1",BS_ ITEMINTERACT);<br> * * * *}<br> * * * *else if(self.aivar[AIV_Food] == FOOD_Bacon) ¦¦ (self.aivar[AIV_Food] == FOOD_Bread)<br> * * * *{<br> * * * * * *AI_PlayAniBS (self,"T_MEAT_RANDOM_1",BS_ITEMINTERACT) ;<br> * * * *}<br> * * * *else<br> * * * *{<br> * * * * * *AI_PlayAniBS (self,"T_FOODHUGE_RANDOM_1",BS_ITEMINTER ACT);<br> * * * *};<br> * * * *// сброс времени цикла<br> * * * *Npc_SetStateTime(self,0);<br> * *};<br> * *return LOOP_CONTINUE;<br>};<br><br>// Функция завершения состояния<br>func void ZS_Stand_Eating_End ()<br>{<br> * *// прекратить анимацию<br> * *AI_PlayAniBS(self,"T_POTION_RANDOM_2",B S_ITEMINTERACT);<br> * *// прекратить жевать пищу<br> * *if(self.aivar[AIV_Food] == FOOD_Apple) *{ AI_UseItemToState(self,ItFo_Apple,-1); };<br> * *if(self.aivar[AIV_Food] == FOOD_Cheese) { AI_UseItemToState(self,ItFo_Cheese,-1);};<br> * *if(self.aivar[AIV_Food] == FOOD_Bacon) *{ AI_UseItemToState(self,ItFo_Bacon,-1); };<br> * *if(self.aivar[AIV_Food] == FOOD_Bread) *{ AI_UseItemToState(self,ItFoMutton,-1); };<br>};<br><br><br>ЗЫ: Не забывайте про "прослойки", иногда чтобы выдать инфу приходиться ждать окончания суток.<br>
|
Текущее время: 20:52. Часовой пояс GMT +4. |
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
AGFC: Valley of Gothic © 2004-2022