Показать сообщение отдельно
Старый 04.03.2005, 09:40   #120
Vam

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

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

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