|
Re: Уроки скриптологии
12. Вспомогательные В_ функции для людей.
Все В_ функции расположены в директории ..\AI\Human\B_Human\
// ************************************************** ****** // Функция переводящая НПС в состояние атаки // ************************************************** ****** * * // ====================================== // Аргументы: // -------------------------------------- // slf * * * * * * *- атакующий НПС (далее - агрессор) // oth * * * * * * *- атакуемый НПС (далее - жертва) // attack_reason * *- причина атаки // wait * * * * * * - время выжидания перед атакой // ======================================
func void B_Attack(var C_NPC slf,var C_NPC oth,var int attack_reason,var int wait) { * *// установить агрессору время задержки перед атакой * *slf.aivar[AIV_WaitBeforeAttack] = wait; * *// если агрессор должен атаковать немедленно * *if(attack_reason == AR_SuddenEnemyInferno) * *{ * * * *// установить агрессору флаг наличия врага * * * *slf.aivar[AIV_EnemyOverride] = FALSE; * * * *// послать жертве восприятие нападения * * * *Npc_SendPassivePerc(slf,PERC_ASSESSFIGHTSOUND,slf ,oth); * *}; * *// если агрессор находится в состоянии разговора * *if(Npc_IsInState(slf,ZS_Talk)) * *{ * * * *// закончить разговор агрессору * * * *slf.aivar[AIV_INVINCIBLE] = FALSE; * * * *// закончить разговор жертве * * * *oth.aivar[AIV_INVINCIBLE] = FALSE; * *}; * *// если агрессор находится в состоянии атаки и жертва есть последняя цель агрессора * *if(Npc_IsInState(slf,ZS_Attack)) && (Hlp_GetInstanceID(oth) == slf.aivar[AIV_LASTTARGET]) * *{ * * * *// если причина атаки агрессора не убийство жертвы и новая причина атаки приоритетней существующей причины атаки * * * *if(!C_NpcHasAttackReasonToKill(slf)) && (attack_reason > slf.aivar[AIV_ATTACKREASON]) * * * *{ * * * * * *// установить агрессору новую причину атаки * * * * * *slf.aivar[AIV_ATTACKREASON] = attack_reason; * * * * * *// если жертва ГГ * * * * * *if(Npc_IsPlayer(oth)) * * * * * *{ * * * * * * * *// установить агрессору причину атаки ГГ * * * * * * * *slf.aivar[AIV_LastPlayerAR] = attack_reason; * * * * * *}; * * * *}; * *} * *else // иначе * *{ * * * * *// установить агрессору новую причину атаки * * * *slf.aivar[AIV_ATTACKREASON] = attack_reason; * * * *// если жертва ГГ * * * *if (Npc_IsPlayer(oth)) * * * *{ * * * * * *// установить агрессору причину атаки ГГ * * * * * *slf.aivar[AIV_LastPlayerAR] = attack_reason; * * * *}; * *}; * *// если агрессор атакует убийцу овец * *if(slf.aivar[AIV_ATTACKREASON] == AR_SheepKiller) * *{ * * * *// запоминается новость, что жертва убила овцу * * * *B_MemorizePlayerCrime(slf,oth,CRIME_SHEEPKILLER); * *}; * *// если причина атаки вызвана повреждением агрессора или является реакцией на обнаженное оружие * *if(slf.aivar[AIV_ATTACKREASON] == AR_ReactToDamage) ¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_ReactToWeapon) * *{ * * * *// если агрессор имеет дело не с "крутым парнем" и (жертва не ГГ и не друг агрессору) * * * *if(!C_NpcIsToughGuy(slf)) && (!(Npc_IsPlayer(oth) && (slf.npctype == NPCTYPE_FRIEND))) * * * *{ * * * * * *// запоминается новость, что ГГ сражался с НПС * * * * * *B_MemorizePlayerCrime(slf,oth,CRIME_ATTACK); * * * *}; * *}; * *// если причина атаки воровство или использование МОВа * *if(slf.aivar[AIV_ATTACKREASON] == AR_Theft) ¦¦ (slf.aivar[AIV_ATTACKREASON] == AR_UseMob) * *{ * * * *// запоминается новость, что ГГ воровал * * * *B_MemorizePlayerCrime(slf,oth,CRIME_THEFT); * *}; * *// если причина атаки убийство человека * *if(slf.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman) * *{ * * * *// запоминается новость, что ГГ совершил убийство * * * *B_MemorizePlayerCrime(slf,oth,CRIME_MURDER); * *}; * *// если агрессор уже в состоянии атаки * *if(Npc_IsInState(slf,ZS_Attack)) * *{ * * * *return; * *}; * *// если причина атаки убийство * *if (slf.aivar[AIV_ATTACKREASON] == AR_KILL) * *{ * * * *// установить враждебное отношение агрессора к ГГ * * * *B_SetAttitude(slf,ATT_HOSTILE); * *}; * *// если ГГ жертва * *if(Npc_IsPlayer(oth)) * *{ * * * *// параметр последнего сражения с ГГ - прервано * * * *slf.aivar[AIV_LastFightAgainstPlayer] = FIGHT_CANCEL; * * * *// последнее сражение не комментировалось * * * *slf.aivar[AIV_LastFightComment] = FALSE; * *}; * *// если агрессор не в состоянии разговора * *if(!Npc_IsInState(slf,ZS_Talk)) * *{ * * * *// очистить очередь AI состояний агрессора * * * *Npc_ClearAIQueue(slf); * *}; * *// запретить агрессору восприятия * *B_ClearPerceptions(slf); * *// установить в качестве цели жертву * *Npc_SetTarget(slf,oth); * *// если агрессор лежит * *if(C_BodyStateContains(slf,BS_LIE)) * *{ * * * *// переход в состояние атаки с завершением предыдущего состояния * * * *AI_StartState(slf,ZS_Attack,1,""); * *} * *else // иначе * *{ * * * *// немедленный переход в состояние атаки * * * *AI_StartState(slf,ZS_Attack,0,""); * *}; * *return; };
... еще один файл
// ************************************** // Функция вызова охраны // -------------------------------------- // self - НПС агрессор, other - НПС жертва // **************************************
// Функция проверки, может ли НПС вызвать охрану // ================================================== ========= // Аргумент: slf - НПС вызывающий охрану // ----------------------------------------------------------- // Возвращает: TRUE - охрана может быть вызвана, иначе - FALSE. // ================================================== ========= func int C_WantToCallGuards(var C_NPC slf) { * *// если агрессор не является членом партии ГГ * *if(self.aivar[AIV_PARTYMEMBER] == FALSE) * *{ * * * *// если НПС принадлежит к * * * *if(slf.guild == GIL_PAL) * *// паладинам * * * *¦¦ (slf.guild == GIL_MIL) * // или милиции * * * *¦¦ (slf.guild == GIL_VLK) * // или горожанам * * * *¦¦ (slf.guild == GIL_SLD) * // или наемникам * * * *¦¦ (slf.guild == GIL_BAU) * // или крестьянам * * * *{ * * * * * *// охрана может быть вызвана * * * * * *return TRUE; * * * *}; * *}; * *// охрану вызвать нельзя * *return FALSE; };
// Вызов охраны func void B_CallGuards() { * *// если агрессор не может вызвать охрану * *if(!C_WantToCallGuards(self)) * *{ * * * *return; * *}; * *// если причина атаки * *if(self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToKill) * *// вызвана охрана по факту убийства * *¦¦ (self.aivar[AIV_ATTACKREASON] == AR_GuardStopsFight) * * // или охрана прекратила атаковать преступника * *¦¦ (self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToThief) *// или охрана вызвана по факту воровства * *¦¦ (self.aivar[AIV_ATTACKREASON] == AR_GuardCalledToRoom) * // или охрана вызвана для защиты помещения * *{ * * * *// агрессор говорит жертве (SVM фраза "ТРЕВОГА!") * * * *B_Say_Overlay(self,other,"$ALARM"); * * * *return; * *}; * * * * *// если причина атаки - нападение на врага или убийство человека * *if(self.aivar[AIV_ATTACKREASON] == AR_GuildEnemy) ¦¦ (self.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman) * *{ * * * *// если агрессор милиционер или паладин или наемник * * * *if(self.guild == GIL_MIL) ¦¦ (self.guild == GIL_PAL) ¦¦ (self.guild == GIL_SLD) * * * *{ * * * * * *// агрессор говорит жертве (SVM фраза "ТРЕВОГА!") * * * * * *B_Say_Overlay(self,other,"$ALARM"); * * * * * *// агрессор посылает восприятие нападения * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other); * * * * * *return; * * * *}; * * * *// если агрессор имеет дело не с "крутым парнем" * * * *if(!C_NpcIsToughGuy(self)) * * * *{ * * * * * *// агрессор говорит жертве (SVM фраза "ОХРАНА!") * * * * * *B_Say_Overlay(self,other,"$GUARDS"); * * * * * *// агрессор посылает восприятие нападения * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other); * * * * * *return; * * * *}; * * * *return; * *}; * *// если охрана ворот атакует незваного гостя * *if(self.aivar[AIV_ATTACKREASON] == AR_GuardStopsIntruder) * *{ * * * *// агрессор говорит жертве (SVM фраза "ТРЕВОГА!") * * * *B_Say_Overlay(self,other,"$ALARM"); * * * *// агрессор посылает восприятие нападения * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other); * * * *return; * *}; * *// если причина атаки воровство или использование чужого МОВа * *if(self.aivar[AIV_ATTACKREASON] == AR_Theft) ¦¦ (self.aivar[AIV_ATTACKREASON] == AR_UseMob) * *{ * * * *// если агрессор имеет дело не с "крутым парнем" * * * *if(!C_NpcIsToughGuy(self)) * * * *{ * * * * * *// агрессор говорит жертве (SVM фраза "ОХРАНА!") * * * * * *B_Say_Overlay(self,other,"$GUARDS"); * * * * * *// агрессор посылает восприятие нападения * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other); * * * *}; * * * *return; * *}; * *// если причина нападения - реакция на обнаженное оружие * *if (self.aivar[AIV_ATTACKREASON] == AR_ReactToWeapon) * *{ * * * *// если агрессор имеет дело не с "крутым парнем" * * * *if(!C_NpcIsToughGuy(self)) * * * *{ * * * * * *// агрессор говорит жертве (SVM фраза "ОХРАНА!") * * * * * *B_Say_Overlay(self,other,"$GUARDS"); * * * * * *// агрессор посылает восприятие нападения * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other); * * * *}; * * * *return; * *}; * *// если причина нападения - посягательство на чужое помещение * *if(self.aivar[AIV_ATTACKREASON] == AR_ClearRoom) * *{ * * * *// если агрессор милиционер или паладин или наемник * * * *if(self.guild == GIL_MIL) ¦¦ (self.guild == GIL_PAL) ¦¦ (self.guild == GIL_SLD) * * * *{ * * * * * *// агрессор говорит жертве (SVM фраза "ТРЕВОГА!") * * * * * *B_Say_Overlay(self,other,"$ALARM"); * * * * * *// агрессор посылает восприятие нападения * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other); * * * * * *return; * * * *}; * * * *// если агрессор имеет дело не с "крутым парнем" * * * *if(!C_NpcIsToughGuy(self)) * * * *{ * * * * * *// агрессор говорит жертве (SVM фраза "ОХРАНА!") * * * * * *B_Say_Overlay(self,other,"$GUARDS"); * * * * * *// агрессор посылает восприятие нападения * * * * * *Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,se lf,other); * * * * * *return; * * * *}; * * * *return; * *}; * *return; }; *
|